如何在Django中注销用户?

22

我们的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)

但是,如果他们仍然登录状态,则此会话仍在工作中。我们如何立即使它们无效?所有会话中间件的设置都是默认值。


这应该被标记为 https://dev59.com/LHNA5IYBdhLWcg3wdtld 的重复问题。特别是,我在那里找到了一个适合我的答案。 - Torsten Bronger
3个回答

32

您可以使用以下方式将其注销:

from django.contrib.auth import logout

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

...从任何视图中。

logout() Django文档这里


1
同样地,从django.contrib.auth导入logout。 - C.B.
这似乎并没有回答问题。OP似乎想要一种立即手动注销用户的方法(如果可能的话,这可能涉及某种会话操作)。 - Daniel Roseman
3
即使你不立即注销用户,但只要他们试图访问任何视图或执行检查的视图,无效用户就会被强制登出。 - user2867522
我添加了一段代码片段来更准确地解释我们正在做什么。正如您所看到的,我们没有“request”对象。 - Torsten Bronger
至少将用户设置为非活动状态并不会阻止他或她继续使用该网站。即使处于非活动状态,我仍然可以四处走动。吊销的权限可能会施加一定的限制,但也仅限于此。 - Torsten Bronger

1
您可以使用一个会话后端来查询和获取特定用户的会话。在这些会话后端中,Session有一个到User的外键,因此您可以轻松地查询会话: 使用这些后端,删除用户的所有会话只需一行代码即可完成:
# log-out a user
user.session_set.all().delete()

免责声明:我是 django-qsessions 的作者。

1
除了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):
    ....

3
谢谢,我不知道这个装饰器,它将来可能对我有用。然而,用这个装饰器把6万行代码弄得乱糟糟的,确实让我感到缺乏热情。;-) 例如,一个logout(user)函数会很有帮助。 - Torsten Bronger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接