01/10/2018, 08:17

Xin ý tưởng về form login

Cho mình hỏi có cách nào để chặn không cho 1 tài khoản có thể đăng nhập từ 2 máy khác nhau trong cùng 1 thời điểm được không ?

Chẵn viết 10:32 ngày 01/10/2018

chờ cao nhân vào giải thích =))

Nhân Nguyễn viết 10:25 ngày 01/10/2018

Tức giả sử tài khoản abc dc máy A login và đang sử dụng, cùng thời điểm đó ở máy B cũng login bằng tài khoản abc thì nó sẽ báo tài khoản đang được sử dụng bởi 1 người khác.

Thang Pham viết 10:26 ngày 01/10/2018

theo mình thì bạn nên lưu trong DB một trường cho trạng thái đăng nhập để biết user đó có login hay chưa. Việc này đồng nghĩa với việc nếu tài khoản abc đã login rồi thì bạn sẽ chẳng thể login bằng ở bất kì: browser hay máy nào khác nữa. ví du: trong DB bạn có thêm field Status (dành cho table user). Mỗi khi login thành công bạn update Status = true.

Nhân Nguyễn viết 10:32 ngày 01/10/2018

Cảm ơn Thắng. Mình cũng đã nghĩ đến trường hợp này và khi logout hay hết session thì sẽ remove cái field đó đi, nhưng nếu làm như vậy sẽ bị mắc 1 chỗ là nếu máy A login tk đó thành công xong bị mất mạng thì filed đó mãi mãi tồn tại =>>> không máy nào login dc nữa.

Thang Pham viết 10:29 ngày 01/10/2018

nếu vậy bạn phải nhờ admin can thiệp thôi. Vì bạn đang muốn hạn chế login trên các thiết bị và browser khác thì case này thật sự mình cũng chưa biết thế nào.
Nhưng bạn để ý xem facebook, zalo, và các mạng xã hội khác họ đều cho phép login trên nhiều thiết bị. Nhưng nó sẽ thông báo chung để bạn xác nhận rằng người login ở máy đó hoặc thiết bị đó có phải là bạn không. Khi bạn không đồng ý cho máy đó login thì nó sẽ logout. Mình nghĩ bạn nên tìm hiểu cách này.

Nhân Nguyễn viết 10:18 ngày 01/10/2018

Vì chức năng này liên quan đến hoàn tiền giao dịch nên phải làm vậy c ak. Thanks c nhé, để t tìm hiểu về cách này xem sao

Đào An viết 10:18 ngày 01/10/2018

trong db bạn thêm 1 cột nữa là timeout chả hạn khi có bất cứ request nào từ user thì lại set mặc định giá trị của timeout là date.now()+15 phút
khi đó data.now() < timeout thì sẽ ko cho login

Nhân Nguyễn viết 10:23 ngày 01/10/2018

Cảm ơn An đã chia sẻ. Theo như cách này, mỗi lần request lại phải phi vào DB để update 1 lần => sẽ ảnh hưởng đến performance rất nhiều

Nguyen Ca viết 10:17 ngày 01/10/2018

Khác máy hay khác browser nhỉ? thông thường thi cái login sau sẽ overwride cái login trước

Nhân Nguyễn viết 10:23 ngày 01/10/2018

Khác máy cậu ạ …

Đỗ Mạnh Hà viết 10:23 ngày 01/10/2018

Theo như ý bạn muốn thì giống như kiểu làm Banking Transaction. (Tại một thời điểm chỉ nhận 1 request duy nhất của user tại device nào đó.)

Như vậy thì bạn có thể dùng cơ chế check SESSION tại các thời điểm request của user. (Nếu có user đang logged in rồi thì sẽ out thằng cũ để accept thằng mới hoặc chờ thằng cũ accept thì thằng user mới mới được login còn không thì bị denied) (và dĩ nhiên phải update và store lại SESSION tại mỗi thời điểm có user mới login thành công)

Còn việc bạn store SESSION bằng công nghệ gì thì theo mình tùy thuộc vào bạn chọn thôi.

P/S: Muốn extend thêm functionality thì phải chấp nhận performance sẽ giảm đi thôi, ít hay nhiều là do cách thực hiện và tối ưu của bạn thôi (trừ những trường hợp không liên quan)

Tao Không Ngu. viết 10:20 ngày 01/10/2018

Hi Nhân Nguyễn.
Tối ưu code xớm là 1 tội ác vậy nên thay vì suy nghĩ rằng nếu làm thế này thì giảm hiệu năng trong khi bạn không chức năng đó để mà đánh giá hiệu năng.
Vấn đề của bạn nằm ở luật login.
Luật 1. Khi 1 máy khác login thì mặc định phiên trước đó bị bay ra cho phiên mới làm việc.
Luật 2. Khi 1 máy login nó phải trờ đến khi phiên khác xong.
Luật 3. Bay cả hai ra và không cho login lại nữa.
Luật 4. Cho login trên cả hai máy.
Phân tích ưu nhược điểm của từng cái cũng như điều kiện thực tế chọn ra giải pháp phù hợp.

Ghi chú trong luật 2 khi phiên trước bị lock do lỗi mạng thì phần quản lý phiên làm việc cần biết được rằng phiên này đã đăng xuất hay bị vấn đề đường truyền v.v.v… để giải quyết. (Có nhiều giải pháp đặt timeout, gửi ping hay gửi yêu cầu xác nhận.).

Giải pháp đơn giản sau khi xác thực tài khoản mật khẩu v.v.v… thì kết nối được đưa đến bộ quản lý phiên làm việc. Tại đây truy xuất cơ sở dữ liệu lấy ID của tài khoản hoặc trạng thái đăng nhập của tài khoản. Xác định trạng thái đang đăng nhập thì gửi 1 yêu cầu xác nhận đến thiết bị đang đang nhập để xác thực trạng thái hoạt động hoặc cảnh báo cho người dùng biết. Sau đó tùy theo yêu cầu hệ thống mà đưa ra giải pháp.

Bài liên quan
0