• Django 用户认证系统使用总结


    Django用户认证系统使用总结

    by:授客 QQ1033553122

     

    测试环境

    Win7

    Django 1.11

     

     

     

     

    使用Django认证系统

    本文按默认配置讲解Django认证系统的用法。如果默认的认证无法满足项目,Django提供了对认证系统的扩展与定制。

    Django身份验证同时提供身份验证和授权,通常称为身份验证系统,因为这些特性有些耦合。

     

    用户对象

    默认user对象主要属性:

    • username
    • password
    • email
    • first_name
    • last_name

     

    创建用户对象

    >>>fromdjango.contrib.auth.modelsimportUser
    >>>user=User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
     
    #如上,此时用户对象已经被保存到数据库了,可以对它的属性进行修改
    >>>user.last_name='Lennon'
    >>>user.save()

    如果已经安装了Django admin应用,可以直接创建用户

    创建超级用户

    使用createsuperuser 命令:

    $ python manage.py createsuperuser --username=joe --email=joe@example.com

    回车后,会提示输入密码,输入密码后回车,立即创建用户。如果命令行省略了--username 或--email 选项,则回车后还会提示输入这些选项的值。

     

    修改密码

    Django采用hash算法存储用户密码(参考documentation of how passwords are managed

    通过命令行修改用户密码:

    manage.py changepassword user_name

    如果不提供user_name,则默认修改当前系统用户的密码.

     

    通过api修改用户密码

    >>>fromdjango.contrib.auth.modelsimportUser
    >>>u=User.objects.get(username='john')
    >>>u.set_password('new password')
    >>>u.save()

    注:这里new password为明文

    如果已经安装了Django admin应用,也可以在认证系统管理页面修改用户密码 

    修改密码,将注销对应用户的所有会话。

     

    用户认证

    authenticate(request=None**credentials)

    使用authenticate()来确认一系列认证。函数携带了credentials关键词参数,默认情况为usernamepassword。如果认证通过,则返回对应的User对象,否则返回None:

    fromdjango.contrib.authimportauthenticate

     

    user=authenticate(username='john', password='secret')

    ifuserisnotNone:

    # A backend authenticated the credentials

    else:
    # No backend authenticated the credentials

     

     

    除username,password参数之外,我们还可以添加其它条件:

    例子,验证用户账号密码是否正确,同时要求被验证用户未被删除(is_delete=1),也就是说,验证用户账号密码前获取的用户数据时,自动已经被删除的用户

    user=authenticate(username='john', password='secret',is_delete=1)

     

    当然,除了是否删除,是否禁用等字段,其它字段一般不推荐这么做,可以在验证用户账号密码前进行其它前置条件的验证

     

    注意:默认的,django会优先验证我们显示提供的参数,最后再验证is_active是否未1,如果为1,则返回None

     

    权限和认证(Permissions and Authorization)

    Web请求中的认证

    Django为每个请求提供了 request.user属性,该属性代表当前用户。如果当前用户未登录,则该属性值将被设置为一个匿名用户AnonymousUser,否则将设置为User的一个实例。

    ifrequest.user.is_authenticated:# 已登录
    # Do something for authenticated users.
    ...
    else:# 未登录
    # Do something for anonymous users.
    ...

     

    登录

    login(requestuserbackend=None)[source]

    login函数会保存用户id到session.

    注意:用户登录后,会话中依旧保留登录前的的任何匿名会话数据。

    fromdjango.contrib.authimportauthenticate, login
    defmy_view(request):
    username=request.POST['username']
    password=request.POST['password']
     
    # 验证用户名和密码,返回用户对象
    user=authenticate(request, username=username, password=password)
    ifuserisnotNone:
    login(request, user)
    # do something 比如重定向到一个成功页面.
    ...
    else:
    # do something,比如返回一个登录错误消息
    ...
     

    选择认证后端(backend)

    略.

     

    退出

    logout(request)

     

    例子:

    fromdjango.contrib.authimportlogout
     
    deflogout_view(request):
    logout(request)
    # do something 比如重定向到一个成功页面.

    注意:如果用户未登录,执行logout函数并不会抛出任何异常。

    调用logout函数,会清空当前请求的所有会话数据,移除所有已存在数据。

     

    对登录用户的访问限制

    原始方式

    简单,原始的方式就是检查request.user.is_authenticated判断是否认证:

    fromdjango.confimportsettings
    fromdjango.shortcutsimportredirect
     
    defmy_view(request):
    ifnotrequest.user.is_authenticated:
    returnredirect('%s?next=%s'% (settings.LOGIN_URL, request.path))
    # ...

    或者:

    fromdjango.shortcutsimportrender
     
    defmy_view(request):
    ifnotrequest.user.is_authenticated:
    returnrender(request, 'myapp/login_error.html')
    # ...
     

    login_required装饰器

    login_required(redirect_field_name='next'login_url=None)

    作为快捷方式,可以使用login_required():

    fromdjango.contrib.auth.decoratorsimportlogin_required
     
    @login_required
    defmy_view(request):
    ...

    login_required() 做以下事情:

    • 如果用户未登录,重定向到settings.LOGIN_URL变量指定的url,并把当前请求的绝对URL赋值给查询字符串。例: /accounts/login/?next=/polls/3/.
    • 如果用户已登录,正常执行视图。

    默认的,查询字符串参数名称为“next”,如果想用其它名称,需要使用loging_required的可选参数redirect_field_name,举例如下

    fromdjango.contrib.auth.decoratorsimportlogin_required
     
    @login_required(redirect_field_name='my_redirect_field')
    defmy_view(request):
    ...

    对应的,html模板中也要使用对应参数名称。

     

    login_required()还携带了可选参数 login_url。例:

    fromdjango.contrib.auth.decoratorsimportlogin_required
     
    @login_required(login_url='/accounts/login/')
    defmy_view(request):
    ...

    注意,如果不指定login_url参数,则需要配置settings.LOGIN_URL.

    更多详情,参考官方文档。

     

    一些常见的装饰器

    @require_POST # 设置视图的http访问方法必须为POST

    @require_GET  # 设置视图的http访问方法必须为GET

     

    例子:设置视图的访问方法必须为POST

    from django.views.decorators.http import require_POST,require_GET

     

    @require_POST
    def test_page(request):
    return render(request, 'website/pages/mytest.html',{})

     

    访问效果

     

     

     

    The LoginRequired mixin

     

    Limiting access to logged-in users that pass a test

     

    The permission_required decorator

     

    The PermissionRequiredMixin mixin

     

    Redirecting unauthorized requests in class-based views

    Session invalidation on password change

    Authentication Views

    Using the views

    All authentication views

    Helper functions

    Built-in forms

     

    模板中的认证数据

    当使用RequestContext,并且开启了'django.contrib.auth.context_processors.auth'上下文处理器时(可在settings.py中配置),当前已登录用户和他们的权限都被存储为变量,存放在模板上下文中

    Users

    例子:

    {%ifuser.is_authenticated%}
    <p>Welcome, {{user.username}}. Thanks for logging in.</p>{%else%}
    <p>Welcome, new user. Please log in.</p>{%endif%}

    如果未使用RequestContext,则模板变量不可获取,比如上述的 {{ user }}

     

    Permissions

    Managing users in the admin

     

     

    参考链接

    https://docs.djangoproject.com/en/2.1/topics/auth/

     

  • 相关阅读:
    dispatchEvent 的应用
    sql语句中日期时间格式化查询
    Dotfuscator Professional Edition 4.9.7500.9484 混淆工具破解版+使用教程
    多表链接 Left join
    多线程计时器
    C#数据库事务原理及实践
    用户sa 登录失败。原因: 该帐户的密码必须更改 sql2008
    Application.DoEvents()和多线程
    C#中DataSet和DataReader的区别
    ROW_NUMBER() OVER函数的基本用法
  • 原文地址:https://www.cnblogs.com/shouke/p/13702998.html
Copyright © 2020-2023  润新知