2010-07-25 30 views
10

Tôi đang phát triển phần quản lý người dùng của trang web sẽ lưu trữ một webcast. Mục tiêu là để đồng thời sử dụng cùng một tên người dùng (địa chỉ email). Tức là, chúng tôi không muốn hai cá nhân sử dụng một thông tin đăng nhập để xem sự kiện.Làm thế nào để ngăn chặn đăng nhập người dùng đồng thời trong trang web PHP/MySQL?

Tôi đã thiết lập bảng chứa dữ liệu đăng ký người dùng có regID làm khóa chính. Suy nghĩ của tôi là tạo một bảng lịch sử đăng nhập với tên người dùng là khóa chính, khóa ngoài cho tên người dùng trong bảng đăng ký. Bảng lịch sử đăng nhập sẽ chỉ đơn giản là dấu thời gian khi người dùng đăng nhập vào trang web. Tuy nhiên, điều này sẽ không hoàn thành mục tiêu ngăn chặn nhiều cá nhân của tôi sử dụng cùng một tên đăng nhập.

Thay vào đó, sẽ tốt hơn nếu bạn có trường trạng thái đăng nhập trong lịch sử đăng nhập hoặc bảng người dùng được đặt thành 1 cho đăng nhập và 0 để đăng xuất? Nó sẽ cần một thủ tục lưu trữ để cập nhật giá trị khi đăng nhập và đăng xuất, và cần phải được xác thực khi người dùng đăng nhập sao cho nếu trạng thái đăng nhập = 1, người dùng đã đăng nhập và không thể đăng nhập lần thứ hai. Đây có phải là cách tiếp cận khả thi không?

Vui lòng chia sẻ các phương pháp khác mà bạn đã sử dụng để ngăn không cho các thông tin xác thực đăng nhập giống nhau được chia sẻ giữa nhiều cá nhân.

Cảm ơn, Sid

Trả lời

7

Nếu có thể đăng xuất người dùng đã đăng nhập nếu người khác đăng nhập bằng cùng thông tin xác thực thì bạn có thể làm như sau: khi người dùng đăng nhập tạo ID ngẫu nhiên trong cơ sở dữ liệu của bạn cho người dùng đó và tương tự a cookie phiên. Hai phải phù hợp để xác thực.

+1

Thay thế "cookie" bằng "phiên" và thao tác này sẽ hoạt động tốt. Chỉ cần đảm bảo kiểm tra giá trị phiên đối với cơ sở dữ liệu trên mỗi yêu cầu và luôn đặt lại giá trị khi người dùng đăng nhập lại. Hai người dùng đang cố gắng xem trang sẽ liên tục đăng xuất lẫn nhau. – Charles

+0

Có, cuộc gọi tốt, cập nhật bài đăng để đọc "phiên". – MrWhite

+0

Tôi thích cách tiếp cận của bạn. Thông báo trước sẽ là người dùng thứ hai, khi cố gắng sử dụng một thông tin đăng nhập đã được sử dụng, nhận được một thông báo cho biết ID người dùng đã được đăng nhập hoặc một cái gì đó có hiệu lực đó. Chúng tôi muốn đảm bảo rằng mọi người xem webcast đều có thông tin đăng nhập của riêng họ. Cảm ơn :) – SidC

0

Vấn đề ở đây là phát hiện người sử dụng đăng nhập (ví dụ: cho dù ông không đăng xuất).

Một cách có thể là đăng ký trong cơ sở dữ liệu vào thời gian hoạt động cuối cùng của anh ấy và thời gian đăng xuất rõ ràng của anh ấy. Sau đó bạn có thể từ chối đăng nhập nếu nó đã được thử ít hơn nói cách đây 5 phút tương đối với hoạt động mới nhất của anh ấy và nếu anh ấy không đăng nhập ở giữa.

Bạn có thể buộc "hoạt động" bằng cách yêu cầu các trang trên trang web thăm dò định kỳ máy chủ bằng Javascript.

+0

Có khả thi để tạo một hàm kiểm tra bảng loginhistory để xem liệu người dùng có giao dịch đăng nhập trong 5 phút cuối cùng không có giao dịch đăng xuất tương ứng không? Cảm ơn :) – SidC

+0

@SidC Bạn có thể nhưng sau đó một người khác có thể đăng nhập sau 5 phút đó. – Artefacto

0

Thật dễ dàng để xác định thời điểm ai đó đăng nhập. Sẽ khó xác định hơn khi ai đó đăng xuất. Nếu bạn có một cơ chế giết webcast trực tuyến đến một người dùng cụ thể một cách nhanh chóng, bạn có thể muốn có một cái gì đó bật lên hỏi người dùng nếu họ muốn giết phiên khác của họ nếu bạn nghĩ rằng có thể có một hoạt động.

-3

Bạn có thể muốn cân nhắc tạo một biến toàn cục trong php để lưu trữ mảng băm có trạng thái đăng nhập. Điều này có lợi ích là nếu ứng dụng phải được khởi động lại vì một lý do nào đó, người dùng không bị mắc kẹt trong trạng thái sai trong cơ sở dữ liệu.

Bạn có thể lưu trữ ánh xạ từ ID người dùng đến IP hoặc cookie phiên và yêu cầu chuyển hướng đi kèm với thông tin khác nhau cho trang đăng nhập. Nếu người dùng đăng nhập, phiên khác sẽ bị vô hiệu và các yêu cầu tiếp theo trong phiên cuối cùng sẽ chuyển tiếp tới trang đăng nhập.

0

Bạn đang làm phiên người dùng trên máy chủ như thế nào? Nếu bạn lưu trữ chúng trong db, bạn có thể truy vấn các phiên hoạt động bất cứ khi nào ai đó cố đăng nhập và xem liệu chúng đã có trong đó chưa. Tất nhiên, bạn cũng có thể phải kiểm tra một số loại dấu thời gian vì bạn không được đảm bảo rằng các phiên sẽ biến mất tại session.gc_maxlifetime.

2

Nếu không có trình xử lý phiên của riêng bạn, bạn có thể thực hiện theo dõi song song một chút. Khi người dùng đăng nhập, bạn có thể lưu trữ ID phiên của người dùng và thời gian đăng nhập trong cơ sở dữ liệu (có thể bên trong bảng thông tin người dùng). Sau đó, kịch bản đăng nhập có thể kiểm tra sự tồn tại nếu sessionID này và cho phép/từ chối đăng nhập dựa trên sự hiện diện của ID phiên. Nếu ID của null/trống, sau đó người dùng đăng nhập. Nếu có ID phiên hiện tại và có hơn X phút, hãy cho phép đăng nhập. Nếu không thì sẽ từ chối chúng.

Tất nhiên, có thể bạn muốn cuộn trình xử lý dọn dẹp phiên của riêng mình tại thời điểm đó, để khi các tệp phiên cũ bị xóa, bạn có thể xóa các ID liên quan khỏi cơ sở dữ liệu cùng một lúc.

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