• Django——用户认证


    Django——用户认证

    用户与Authentication(身份验证)

    Django 用户认证系统处理用户帐号权限以及基于cookie的用户会话。 这个系统一般被称为 auth/auth (认证与授权)系统。 这个系统的名称同时也表明了用户常见的两步处理。

    1. 验证 (认证) 用户是否是他所宣称的用户(一般通过查询数据库验证其用户名和密码)
    2. 验证用户是否拥有执行某种操作的 授权 (通常会通过检查一个权限表来确认)

    根据这些需求,Django 认证/授权 系统会包含以下的部分:

    • 用户 : 在网站注册的人
    • 权限 : 用于标识用户是否可以执行某种操作的二进制(yes/no)标志
    • 组 :一种可以将标记和权限应用于多个用户的常用方法
    • Messages : 向用户显示队列式的系统消息的常用方法

    通过 is_authenticated() 方法来判断一个用户是否已经登录了

    if request.user.is_authenticated():
    # Do something for authenticated users.
    else:
    # Do something for anonymous users.
    

    创建用户(创建对象)

    创建用户最直接的方法是使用包含 create_user() 的函数

    >>> from django.contrib.auth.models import User
    >>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
    
    # At this point, user is a User object that has already been saved
    # to the database. You can continue to change its attributes
    # if you want to change other fields.
    >>> user.last_name = 'Lennon'
    >>> user.save()
    

    更改密码

    Django 不会在用户模型里保存原始(明文)密码,而只会存储哈希值(请参阅文档 如何管理密码 documentation of how passwords are managed ) 。因此,请不要试图直接操作用户的密码,这就是创建用户需要辅助函数的原因。

    1.manage.py changepassword *username* 提供了在命令行修改用户密码的方法。它会提示你输入两次新密码,如果操作成功,新密码就立刻生效。如果你没有提供参数 username ,那么将会尝试修改当前系统用户的密码。

    2.在代码里修改密码,使用 set_password():

    >>> from django.contrib.auth.models import User
    >>> u = User.objects.get(username='john')
    >>> u.set_password('new password')
    >>> u.save()
    

    如果你已经按照了 Django admin 管理后台,你也可以在管理后台页面修改密码(请参阅authentication system's admin pages)。

    Django 还提供了允许用户自行修改密码的` 。

    修改密码将会注销用户的所有会话。查看详情请参阅 密码更改时会话失效

    使用User对象

    User 实例一般从 request.user ,或是其他下面即将要讨论到的方法取得,它有很多属性和方法

    AnonymousUser 对象模拟了 部分 的接口,但不是全部,在把它当成真正的user对象 使用前,需要检查一下

    User 对象属性

    属性 描述
    username 必须的,不能多于30个字符,仅用字母数字式字符(字母、数字和下划线)。
    first_name 可选; 少于等于30字符。
    last_name 可选; 少于等于30字符。
    email 可选。 邮件地址。
    password 必需的。 密码的哈希值(Django不储存原始密码)。
    is_staff 布尔值。 用户是否拥有网站的管理权限。
    is_active 布尔值. 设置该账户是否可以登录。 把该标志位置为False而不是直接删除账户。
    is_superuser 布尔值 标识用户是否拥有所有权限,无需显式地权限分配定义。
    last_login 用户上次登录的时间日期。 它被默认设置为当前的日期/时间。
    date_joined 账号被创建的日期时间 当账号被创建时,它被默认设置为当前的日期/时间。

    user对象方法

    方法 描述
    is_authenticated() 如果是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经通过了认证。通过认证并不意味着 用户拥有任何权限,甚至也不检查该用户是否处于激活状 态,这只是表明用户成功的通过了认证。
    is_anonymous() 如果是个 AnonymousUser ,返回值为 True , 如果是 User 对象,返回值为 False 。一般来 说, is_authenticated() 会比这个方法更常用些。
    get_full_name() 返回值为: first_name 加上 last_name ,以 空格分隔。
    set_password(passwd) 如果给定的字符串通过了密码检查,返回 True 。 密码比较已进行了哈希处理。
    get_group_permissions() 返回用户通过所属组获得的权限列表
    get_all_permissions() 返回用户通过所属组和用户自身权限所获得的所有权限 列表。
    has_perm(perm) 如果用户拥有给定的权限,返回 True , perm 应形如 " codename" 的格式。如果用户处于 非激活状态,则总是返回 False 。
    has_perms(perm_list) 如果用户拥有所有给定的权限,返回 True 。 如果用户处于非激活状态,则总是返回 False
    has_module_perms(app_label) 如果用户拥有任何给定 app_label 的权限,返回 True 。如果用户处于非激活状态,则总是返回 False
    get_and_delete_messages() 返回用户的 Message 对象列表,并从队列中删除。
    email_user(subj, msg) 给用户发送电子邮件,用 DEFAULT_FROM_EMAIL 的设 置作为发件人。也可以用第3个参数 from_email 来 覆盖设置。
    get_profile() 返回用户的网站自定义profile
    权限和认证

    User 对象有两个多对多的属性: groups 和 permissions 。 User 对象可以 象使用其他多对多属性的方法一样使用它们。

    # Set a user's groups: 
    myuser.groups = group_list 
    myuser.groups.set([group_list])
    # Add a user to some groups: 
    myuser.groups.add(group1, group2,...) 
    # Remove a user from some groups: 
    myuser.groups.remove(group1, group2,...) 
    # Remove a user from all groups: 
    myuser.groups.clear() 
    # Permissions work the same way 
    myuser.permissions = permission_list 
    myuser.permissions.add(permission1, permission2, ...) myuser.permissions.remove(permission1, permission2, ...)
    myuser.permissions.clear()
    

    登录和退出(验证用户)

    Django 提供内置的视图(view)函数用于处理登录和退出 ,但在开始前,我们来看看如何手工登录和退出,Django 在 django.contrib.auth 中提供了两个函数来处理这些事情—— authenticate() 和 login()

    使用 authenticate() 来验证用户。它使用 usernamepassword 作为参数来验证,对每个身份验证后端( authentication backend )进行检查。如果后端验证有效,则返回一个 :class:~django.contrib.auth.models.User 对象。如果后端引发 PermissionDenied 错误,将返回 None。举例

    from django.contrib.auth import authenticate
    user = authenticate(username='john', password='secret')
    if user is not None:
        # A backend authenticated the credentials
    else:
        # No backend authenticated the credentials
    

    authenticate() 只是验证一个用户的证书而已。而要登录一个用户,使用 login() 。该函数接受一个 HttpRequest 对象和一个 User 对象作为参数并使用Django的会话( session )框架把用户的ID保存在该会话中。

    from django.contrib import auth 
    def login(request): 
        username = request.POST['username'] 
        password = request.POST['password'] 
        user = auth.authenticate(username=username, password=password) #验证成功:一个User实例
        if user is not None and user.is_active: 
            # Correct password, and the user is marked "active" 
            auth.login(request, user) 
            # Redirect to a success page. 
            return redirect("/account/loggedin/") 
        else: 
            # Show an error page 
            return redirect("/account/invalid/")
    

    注销一个用户,在你的视图中使用 django.contrib.auth.logout() 。该函数接受一个 HttpRequest 对象作为参数,没有返回值。

    from django.contrib import auth 
    def logout(request): 
        auth.logout(request) 
        # Redirect to a success page. 
        return redirect("/account/loggedout/")
    #注意,即使用户没有登录, logout() 也不会抛出任何异常。
    

  • 相关阅读:
    求一个数字各个位的数字之和
    二进制和十进制的转换 分别用python和js实现
    pymysql 获取插入数据的主键id
    js03.事件
    02.js运算符
    jsonpath
    01.js控制台
    2.命令补充
    hashmap
    正则表达式的补充
  • 原文地址:https://www.cnblogs.com/notfind/p/11880119.html
Copyright © 2020-2023  润新知