对于已注销的用户,is_authenticated返回True

时间:2015-06-25 11:17:32

标签: django authentication django-rest-framework django-allauth django-rest-auth

我正在使用Django,Django REST框架,Django-rest-auth和Django-allauth编写服务器应用程序。我有一个用于在用户之间传递消息的方法,这应该只在接收者登录时发生。

但是,即使用户已注销(称为is_authenticated(),而该应用又应调用Django的注销),似乎用户对象的rest-auth/logout/方法返回True。什么可能导致这个?我有什么想念的吗?

这是我的代码:

class SendMessage(generics.CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = MessageSerializer

    def perform_create(self, serializer):
        m = self.request.data['msg']
        targetUser = User.objects.get(pk = self.request.data['user'])

        if targetUser.is_authenticated():
            # Send message
        else:
            # Don't send message

3 个答案:

答案 0 :(得分:4)

不幸的是,is_authenticated()方法总是返回true。

 def is_authenticated(self):
    """
    Always return True. This is a way to tell if the user has been
    authenticated in templates.
    """
    return True

用于识别User实例和AnonymousUser实例,这是用户在未通过身份验证时设置的内容。

答案 1 :(得分:1)

尝试获取所有经过身份验证的用户,然后检查目标用户是否在其中:

from django.contrib.auth.models import User
from django.contrib.sessions.models import Session
from django.utils import timezone

def get_all_logged_in_users_ids():
    # Query all non-expired sessions
    # use timezone.now() instead of datetime.now() in latest versions of Django
    sessions = Session.objects.filter(expire_date__gte=timezone.now())
    uid_list = []

    # Build a list of user ids from that query
    for session in sessions:
        data = session.get_decoded()
        uid_list.append(data.get('_auth_user_id', None))
    return uid_list

class SendMessage(generics.CreateAPIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = MessageSerializer

    def perform_create(self, serializer):
        m = self.request.data['msg']
        if (self.request.data['user'] in get_all_logged_in_users_ids()):
            # Send message
        else:
            # Don't send message

Reference

答案 2 :(得分:0)

你误解了is_authenticated正在检查的内容。

请记住,网络是无状态环境。没有服务器级别的“登录”状态:用户是否登录的唯一记录是该用户的计算机上是否存在cookie。

由于用户始终可以在不通知服务器的情况下关闭浏览器或关闭机器,因此没有可靠的方法来确定用户是否确实已登录。唯一可以接近的方法这是每隔几秒钟进行一次重复的Ajax调用,发布到用当前时间更新用户记录的视图。然后,您可以检查用户确实在最近几秒内确实更新了。但这并不完全可靠。

或者,您可以考虑使用某种长轮询系统来保持频道开放。