Django:如何使用 auth_user 表的 is_active?

Posted

技术标签:

【中文标题】Django:如何使用 auth_user 表的 is_active?【英文标题】:Django: How do I use is_active of auth_user table? 【发布时间】:2015-06-26 21:08:37 【问题描述】:

不知道什么时候用这个参数比较好。

djangoproject描述如下:

布尔值。指定是否应将此用户帐户视为活动帐户。我们建议您将此标志设置为 False 而不是删除帐户;这样,如果您的应用程序对用户有任何外键,则外键不会损坏。

这不一定控制用户是否可以登录。身份验证后端不需要检查 is_active 标志,默认后端不需要。如果您想基于 is_active 为 False 拒绝登录,您可以在自己的登录视图或自定义身份验证后端进行检查。但是, login() 视图(默认设置)使用的 AuthenticationForm 会执行此检查,权限检查方法(例如 has_perm() 和 Django 管理员中的身份验证)也会执行此检查。对于非活动用户,所有这些函数/方法都将返回 False。

readthedocs描述如下:

Authorization for inactive users

非活动用户是经过身份验证但其属性 is_active 设置为 False 的用户。然而,这并不意味着他们无权做任何事情。例如,他们可以激活自己的帐户。

权限系统中对匿名用户的支持允许匿名用户有权做某事而非活动的经过身份验证的用户没有权限的情况。

不要忘记在你自己的后端权限方法中测试用户的 is_active 属性。

任何人都可以举一些例子让我知道参数需要注意或如何使用它。

【问题讨论】:

【参考方案1】:
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:  #to check whether user is available or not?
    # the password verified for the user
    if user.is_active:   
        print("User is valid, active and authenticated")
    else:
        print("The password is valid, but the account has been disabled!")
else:
    # the authentication system was unable to verify the username and password
    print("The username and password were incorrect.")

这将有助于您了解 django 身份验证。

【讨论】:

【参考方案2】:

非活动用户的 is_active 字段设置为 False。

从 django 1.10 版开始:ModelBackend(默认身份验证后端)和 RemoteUserBackend 身份验证后端禁止这些非活动用户进行身份验证。因此,如果您使用这些后端,则无需使用以下样式:

#authentication has been successful now...
if user.is_active:
    login(request,user)
    #redirect to success page
else:
    #return disabled account error message

如果自定义用户模型没有 is_active 字段,则允许所有用户进行身份验证。 在 1.10 版本之前,ModelBackend 允许非活动用户进行身份验证 - 这在您首先允许用户进行身份验证然后您允许用户激活他们的帐户(仅在他们成功通过身份验证之后)时很有用。

请注意,@login_required 装饰器不会检查用户的 is_active 标志。 @login_required

检查 AUTHENTICATION_BACKENDS 以查看您正在使用哪些。 见https://docs.djangoproject.com/en/1.10/topics/auth/customizing/

【讨论】:

【参考方案3】:
def MyFormView(request):
    if request.method == 'POST':
        m_form = myform(request.POST)
        a_form = AccountForm(request.POST)
        if m_form.is_valid() and a_form.is_valid():
            user = m_form.save()
            user.is_active = True
            a_form.instance.user = user
            a_form.save()
            messages.success(request,f'Your Account Has Been created')
            return redirect('/')
    else:
        m_form = myform()
        a_form = AccountForm()
    return render(request, 'app/index.html', 'm_form':m_form, 'a_form':a_form)

【讨论】:

请提供解释和你的答案。简单地发布代码不会传播完整脚本过程的知识,这有助于人们理解你的答案背后的逻辑和推理。

以上是关于Django:如何使用 auth_user 表的 is_active?的主要内容,如果未能解决你的问题,请参考以下文章

Django框架之admin管理后台

如何使用 django 向默认 auth_user 模型添加额外的模型字段

Django之用户认证auth模块使用

添加到 auth_user [重复]

在 Travis 上运行 django unittests 时如何解决“psycopg2.errors.UndefinedTable:关系“auth_user”不存在”

使用多个数据库的 Django 错误关系“auth_user”不存在