使用相同的凭据阻止多次登录

时间:2015-12-15 10:39:23

标签: python django python-2.7 django-models

我检查了之前提出的类似问题,但我无法找到合适的答案。

要求:在两台不同的计算机上,无法使用相同的用户凭据访问该应用程序。

我已实施的内容,在登录时,退出用户使用的所有先前设备。

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相同在服务器上。在允许向第二个用户访问任何网站数据之前,如何区分第二个用户并注销第一个用户。

2 个答案:

答案 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)
    )