2015-04-30 15 views
5

Ứng dụng của tôi thực hiện giỏ hàng trong đó người dùng ẩn danh có thể lấp đầy giỏ hàng của họ bằng các sản phẩm. Đăng nhập người dùng chỉ được yêu cầu trước khi thanh toán. Làm thế nào điều này có thể được thực hiện?Cách theo dõi người dùng ẩn danh bằng Flask

Thách thức chính là bình phải theo dõi người dùng (ngay cả khi ẩn danh) và đơn đặt hàng của họ. Cách tiếp cận hiện tại của tôi là tận dụng đối tượng AnonymousUserMixin được gán cho current_user. Giả định là current_user sẽ không thay đổi trong suốt phiên. Tuy nhiên, tôi nhận thấy rằng đối tượng AnonymousUserMixin mới được gán cho current_user, ví dụ: khi làm mới mọi trang trình duyệt. Lưu ý rằng điều này không xảy ra nếu người dùng được xác thực.

Bất kỳ đề xuất nào về cách phá vỡ điều này?

Trả lời

8

Không cần cho một phong tục AnonymousUserMixin, bạn có thể giữ các dữ liệu giỏ mua hàng trong phiên:

  • người dùng nặc danh cho biết thêm một cái gì đó để Hist giỏ hàng -> cập nhật phiên của mình với dữ liệu giỏ
  • người dùng muốn kiểm tra -> chuyển hướng anh ấy đến trang đăng nhập
  • người dùng đã đăng nhập trở lại lúc thanh toán -> lấy dữ liệu giỏ hàng của anh ấy ra khỏi phiên và làm bất cứ điều gì bạn làm nếu anh ấy đăng nhập toàn bộ thời gian
1

Bạn có thể sử dụng lớp con AnonymousUserMixin nếu muốn, nhưng bạn cần thêm một số logic vào nó để bạn có thể kết hợp từng người dùng ẩn danh với một giỏ hàng được lưu trữ trong cơ sở dữ liệu của bạn.

Đây là những gì bạn có thể làm:

  1. Khi một người dùng mới kết nối với ứng dụng của bạn, bạn gán một id duy nhất được tạo ngẫu nhiên. Bạn có thể viết id ngẫu nhiên này cho phiên người dùng (nếu bạn muốn giỏ hàng bị bỏ khi người dùng đóng cửa sổ trình duyệt) hoặc một cookie dài (nếu bạn muốn giỏ hàng được nhớ ngay cả sau khi đóng trình duyệt). Bạn có thể sử dụng Flask-Login để quản lý phiên/cookie thực sự, bạn không phải đối xử với người dùng không xác định là ẩn danh, ngay sau khi bạn chỉ định id cho họ, bạn có thể coi họ là người dùng đã đăng nhập.

  2. Làm cách nào để biết liệu người dùng ẩn danh có được biết hay mới? Khi người dùng kết nối bạn kiểm tra xem phiên hoặc cookie tồn tại, và tìm id ở đó. Nếu tìm thấy id, bạn có thể tìm giỏ hàng cho người dùng. Nếu bạn sử dụng một lớp con của AnonymousUserMixin, thì bạn có thể thêm id làm biến thành viên, để bạn có thể làm current_user.id ngay cả đối với người dùng ẩn danh. Bạn có thể có logic này trong trình nạp lại bộ nạp người dùng Flask-Login.

  3. Khi người dùng sẵn sàng thanh toán cho bạn chuyển đổi người dùng ẩn danh thành người dùng đã đăng ký, hãy giữ nguyên id.

  4. Nếu bạn có một công việc định kỳ dọn dẹp các giỏ ẩn danh cũ/bị bỏ rơi khỏi cơ sở dữ liệu, bạn có thể thấy một người dùng ẩn danh cũ kết nối và cung cấp id người dùng không có giỏ hàng trong cơ sở dữ liệu giỏ hàng được coi là cũ và đã xóa). Bạn có thể xử lý việc này bằng cách tạo một giỏ hàng hoàn toàn mới cho cùng một id và thậm chí bạn có thể thông báo cho người dùng biết rằng nội dung của giỏ hàng đã hết hạn và đã bị xóa.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn! Có cách nào để bảo vệ ứng dụng của tôi khỏi người dùng độc hại không?Ai đó có thể tấn công bằng cách (i) tạo một giỏ hàng và (ii) đóng phiên (hoặc xóa cookie) trong một vòng lặp. Có cách nào để thực hiện công việc cron (hoặc hàng đợi công việc) giúp tránh sự gia tăng không kiểm soát được trong kích thước cơ sở dữ liệu không? Kiểm tra kích thước của cơ sở dữ liệu khi tạo mỗi giỏ hàng là điều tôi muốn tránh. – LuisO

+0

Không có cái gì đó 100% dễ dàng, nhưng bạn có thể theo dõi địa chỉ IP của người dùng và đảm bảo bạn không cho phép nhiều xe cho cùng một địa chỉ. Hoặc bạn có thể viết ngày tạo cho tất cả các xe, và khi bạn cần tạo một cái mới chạy một truy vấn để tìm ra số lượng xe bạn đã tạo trong N phút cuối cùng. Nếu bạn thấy đó là một số lượng lớn, bạn có thể ngừng tạo giỏ hàng mới. – Miguel

Các vấn đề liên quan