【问题标题】:Django user is_authenticated vs. is_active: when should I use one or the other?Django 用户 is_authenticated 与 is_active:我什么时候应该使用其中之一?
【发布时间】:2022-11-24 01:43:24
【问题描述】:

看了文档,还是没有完全掌握User这两个方法的区别:is_activeis_authenticated

两者都返回一个布尔值。虽然 is_authenticated 是只读的(如果您尝试设置它会出现错误),但可以修改 is_active,例如您可以将其设置为 False 而不是删除帐户。

运行这些命令,将停用用户:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=10) # get an arbitrary user   
>>> u.is_active
True
>>> u.is_active = False # change the value
>>> u.save() # save to make effective
>>> u.is_authenticated
True

现在,该用户仍然通过身份验证,但无法再登录。

登录视图使用authenticate()。停用用户登录失败的实际情况是什么?

if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password1']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)

要验证您使用authenticate() 的凭据,它会在成功的情况下返回一个User 对象,否则返回 None。我想如果提供的凭据正确但is_active 为假,它会返回 None。

此外,如果is_active 为 False,则 Jinja 块 {% if user.is_authenticated %} 评估为 false,当我认为 user.is_authenticated 为 True 且只读时,这令人困惑。

问题回顾:

当用户被停用时,is_active 为假,is_authenticated(始终)为真。 authenticate()实际上是在检查用户是否处于活动状态但已通过身份验证?是因为is_authenticated是检查用户是否存在的别名吗?但为什么{% user.is_authenticated %} 甚至是假的?

【问题讨论】:

    标签: python django


    【解决方案1】:

    is_active 是用户帐户的一个属性,可以打开和关闭。您可以在管理界面中或以编程方式执行此操作。仅允许活动用户登录。即您可以使用 is_active 标志来阻止用户登录,而无需更改密码、删除帐户或执行任何其他极端操作。

    is_authenticated 是正在使用的特定用户类别的属性。如果你有实际的User对象,他们的is_authenticated属性总是true;它是 User 类上的静态设置属性。

    is_authenticated 属性仅与请求中的用户对象相关:

    def view(request):
        if request.user.is_authenticated:
            ...
    

    如果请求的用户是不是经过身份验证后,request.user 将不是 User 对象,而是 AnonymousUser 对象,其 is_authenticated 属性始终为 False。这里的想法是 request.user 始终存在,无论用户当前是否通过身份验证。这意味着您不需要编写像if request.user is not None and request.user.... 这样的代码。您总是可以期望用户对象存在,并且您可以使用 is_authenticated 属性区分经过身份验证和未经身份验证(匿名)的用户。

    【讨论】:

    • 附带一提,我们通常不直接访问is_authenticated。相反,我们使用 @login_required 装饰器。 (如果不清楚,此评论更多是针对 OP 和未来的访问者,而不是针对回答者。)
    • @AbdulAzizBarkat 是的,这就是我的意思。我应该在发表评论之前检查文档中的确切名称。谢谢指正。
    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 2012-07-25
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2012-09-22
    • 1970-01-01
    相关资源
    最近更新 更多