我检查了之前提出的类似问题,但我无法找到合适的答案。
要求:在两台不同的计算机上,无法使用相同的用户凭据访问该应用程序。
我已实施的内容,在登录时,退出用户使用的所有先前设备。
public void move(Dot dot) {
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
fun();
}
还剩下什么,如果一个用户登录一个系统并将其from django.contrib.auth.signals import user_logged_in
class UserAccount(models.Model):
"""
This model will be used to extra user information.
"""
user = models.OneToOneField(User, db_index=True)
session = models.CharField(max_length=40, null=True)
ip_address = models.IPAddressField()
def logout_other_devices(user, request, **kwargs):
"""
Delete session(logout all) other devices with same credential.
"""
profile = user.useraccount
if profile.session:
Session.objects.filter(session_key=profile.session).delete()
profile.session = request.session.session_key
profile.ip_address = request.META.get('REMOTE_ADDR')
profile.save()
user_logged_in.connect(logout_other_devices)
(从cookie)传递给在同一个WiFi(或LAN)连接下连接的第二个用户,则第二个用户的IP相同在服务器上。在允许向第二个用户访问任何网站数据之前,如何区分第二个用户并注销第一个用户。
答案 0 :(得分:1)
Django会在用户每次登录时生成一个会话密钥并将其保存在数据库中。如果用户从另一个浏览器/设备登录,Django会创建一个新的会话密钥,而不会删除旧会话密钥。
如果要将用户从其他设备中注销,则只需从db中删除他/她以前的会话密钥。
由于没有简单的方法来确定哪个密钥属于哪个用户,因此您必须在用户登录后将会话密钥保存在用户模型中。因此,在用户模型中添加另一个名为{{1}的字段},像这样:
session_key
您还需要对登录视图进行一些更改,如下所示:
# models.py
class UserAccount(...):
...
session_key = models.CharField(max_length=100, null=True)
答案 1 :(得分:-1)
这应该在这里解决
#models.py
from django.contrib.sessions.models import Session
class UserSession(models.Model):
user_acc = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
session_maneger = models.OneToOneField(Session, on_delete=models.CASCADE)
#views.py
from django.contrib.auth import user_logged_in
from django.dispatch.dispatcher import receiver
from django.contrib.sessions.models import Session
from .models import UserSession
@receiver(user_logged_in)
def remove_other_sessions(sender, user, request, **kwargs):
Session.objects.filter(usersession__user=user).delete() # removing user other session
request.session.save() # here is the saving users current session
# create a link from the user to the current session (for later removal)
UserSession.objects.get_or_create(
user=user,
session=Session.objects.get(pk=request.session.session_key)
)