问题 如何在Django中注销用户?


我们的Django部署每晚都会检查哪些活动用户仍然可以在LDAP目录中找到。如果找不到它们,我们将它们设置为不活动状态。如果他们下次尝试登录,则会失败。这是我们的代码:

def synchronize_users_with_ad(sender, **kwargs):
    """Signal listener which synchronises all active users without a usable
    password against the LDAP directory.  If a user cannot be
    found anymore, he or she is set to “inactive”.
    """
    ldap_connection = LDAPConnection()
    for user in User.objects.filter(is_active=True):
        if not user.has_usable_password() and not existing_in_ldap(user):
            user.is_active = user.is_staff = user.is_superuser = False
            user.save()
            user.groups.clear()
            user.user_permissions.clear()

maintain.connect(synchronize_users_with_ad)

但如果他们仍然登录,则此会话仍然有效。我们怎样才能立即使它们无效?会话中间件的所有设置都是默认值。


10620
2017-08-11 20:19


起源

这应该标记为重复 stackoverflow.com/questions/953879/...  特别是,我在那里找到了答案。 - Torsten Bronger


答案:


您可以使用它们注销

from django.contrib.auth import logout

if <your authentication validation logic>:
    logout(request) 

......在任何视图中。


12
2017-08-11 20:22



from django.contrib.auth import logout 同样 - C.B.
谢谢编辑,Yuval。
这似乎没有回答这个问题。 OP似乎想要一种立即手动登录用户的方法(这可能涉及某种会话操作,如果可能的话)。 - Daniel Roseman
即使您没有立即关闭用户,一旦他们尝试访问任何视图或执行检查的视图,并且无效的用户,他们就会立即注销 logout()。
我添加了一个代码片段来更准确地解释我们正在做什么。如你所见,我们没有 request 目的。 - Torsten Bronger


除了login_required装饰器,你可以使用 user_passes_test装饰者 测试用户是否仍处于活动状态。

from django.contrib.auth import user_passes_test

def is_user_active(user):
    return user.is_active

@user_passes_test(is_user_active, login_url='/your_login')
def your_function(request):
    ....

1
2017-08-12 12:55



谢谢,我不知道这个装饰,有一天它可能对我有用。然而,用这个装饰器混乱60.000 LOC完全没有给我充满热情。 ;-)例如,有助于提供帮助 logout(user) 功能。 - Torsten Bronger