• Django认证系统auth认证


    使用Django认证系统auth认证

        auth认证系统可以处理范围非常广泛的任务,且具有一套细致的密码和权限实现。对于需要与默认配置不同需求的项目,Django支持扩展和自定义认证;会将用户信息写入到 auth_user 表中;
    

    User对象

        User对象是认证系统的核心。它们通常表示与你的站点进行交互的用户,并用于启用限制访问、注册用户信息和给创建者关联内容等。在Django的认证框架中只存在一种类型的用户,因此诸如'superusers'或管理员'staff'用户只是具有特殊属性集的user对象,而不是不同类型的user对象。
    

    默认user的基本属性有:

    username    必选。少于等于30个字符。 用户名可以包含字母、数字、_、@、+、.和- 字符。
    password    必选。 密码的哈希及元数据。(Django 不保存原始密码)。原始密码可以无限长而且可以包含任意字符。
    email       可选。邮箱地址。
    first_name  可选。 少于等于30个字符。
    last_name   可选。少于30个字符。
    is_superuser 可选。布尔值。指定这个用户拥有所有的权限而不需要给他们分配明确的权限。1为super 0 为普通用户。
    last_login  无需设置。用户最后一次登录的时间。自动记录。
    is_staff    可选。布尔值。指示用户是否可以访问Admin 站点。
    is_active   可选。布尔值。指示用户的账号是否激活。 1为激活 0 为未激活(未激活用户不可登陆)。
    date_joined 无需设置。账户创建的时间。当账号创建时,默认设置为当前的date/time。
    

    详情djangoAPI

    创建用户users

    1.创建users最直接的方法是使用create_user()辅助函数:

    from django.contrib.auth.models import User
    user = User.objects.create_user('zhangsan', 'zhangsan@qq.com', 'zhangsanpassword')
    
    # 此时已经保存用户对象到数据库,可以继续更改其属性,如果你想改变其他领域。
    user.last_name = 'Li'
    user.save()
    

    创建superusers

    1.使用createsuperuser命令创建superusers:

    D:file_Djangauth>python manage.py createsuperuser --username=baolin --email=baolin@gmail.com
    
    # 将会提示你输入一个密码。在你输入一个密码后,该user将会立即创建。如果不带--username和--email选项,将会提示你输入这些值。
    

    修改密码

    Django不会在user模型上存储原始的(明文)密码,而只是一个哈希值。因此不要尝试直接操作user的password属性,修改密码;
    

    1.修改密码方法一:changepassword username

    # 密码必须包含至少8个字符。
    D:file_Djangauth>python manage.py changepassword zhangsan
    Changing password for user 'zhangsan'
    Password:
    Password (again):
    Password changed successfully for user 'zhangsan'
    

    2.通过程序修改密码,使用set_password()

    from django.contrib.auth.models import User
    u = User.objects.get(username='zhangsan')
    u.set_password("zhangsan123")
    u.save()
    

    认证Users

        使用authenticate(),认证一组给定的用户名和密码。它接收关键字参数形式的凭证,使用默认配置时参数是username和password,如果密码能够匹配给定的用户名,它将返回一个User对象。如果密码无效,authenticate()返回None。
    

    1.urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login/', views.login),
        url(r'^index/', views.index),
        url(r'^logout/', views.log_out),
        url(r'^reg/', views.reg),
        url(r'^set_pwd/', views.set_pwd),
    ]
    

    2.获取前端login.html传入得用户密码,判断用户验证是否正确,正确跳转到index页面,否则跳转到登陆页面;

    from django.shortcuts import render, redirect, HttpResponse
    
    from django.contrib import auth
    from django.contrib.auth.models import User
    from django.contrib.auth.decorators import login_required
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get("user")
            password = request.POST.get("pwd")
    
            # 直接通过 authenticate 可以直接调用 auth_user 表中的用户进行验证
            # 验证成功,就会有返回值,否则返回None
            user = auth.authenticate(username=username, password=password)
            if user:
                # 匹配给 session 绑定相应的值 user 
                auth.login(request, user)
                return redirect("/index/")
            else:
                # 不成功重定向到 login 页面
                return redirect("/login/")
        return render(request, "login.html")
        
    
    # 使用Django自带得装饰器login_required 实现验证
    @login_required(login_url='/login/')
    def index(request):
        # 如不使用 @login_required 装饰器 认证,可以直接通过if 判断request.user.is_authenticated 是否有值
        # if not request.user.is_authenticated():
        #     return redirect("/login/")
    
        return render(request, "index.html")
    
    
    # auth 提供的 用户注销 auth.logout(request)
    def log_out(request):
        # auth 提供的 用户注销
        auth.logout(request)
        return redirect("/login/")
        
    
    # 添加用户(可以判断如果是超级用户,允许创建用户)
    @login_required(login_url="/login/")
    def reg(request):
        if request.method == "POST":
            username = request.POST.get("user")
            password = request.POST.get("pwd")
    
            # auth 提供的 向 auth.user 表写入用户信息的方法
            User.objects.create_user(username=username, password=password)
            return redirect("/index/")
        return render(request, "reg.html")
        
    
    # 修改密码
    @login_required(login_url="/login/")
    def set_pwd(request):
        if request.method == "POST":
            pwd = request.POST.get("pwd")
            # pwd1 = request.POST.get("pwd1")
            username = request.user
            print(username,pwd)
            
            # 修改密码 需要 分开写,最后save()报错结果
            u = User.objects.get(username=username)
            u.set_password(pwd)
            u.save()
            return redirect("/login/")
        return render(request,"set_pwd.html")
    

    3.前端html设置:

    ###############index.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <!-- 自行引入 Bootstrap 核心 组件 文件 -->
    </head>
    <body>
        <nav class="navbar navbar-inverse">
            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
              <ul class="nav navbar-nav navbar-right">
              
                {# request.user 可以直接获取用 当前认证的用户 #}
                <li><a href="#">{{ request.user }}</a></li>
                <li><a href="/logout/">注销</a></li>
                <li><a href="/reg/">添加用户</a></li>
              </ul>
            </div><!-- /.navbar-collapse -->
        </nav>
    </body>
    </html>
    
    ###############login.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/login/" method="post">
        {% csrf_token %}
        <p>姓名:<input name="user" type="text"></p>
        <p>密码:<input name="pwd" type="text"></p>
        <input type="submit">
    </form>
    </body>
    </html>
    
    ###############reg.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h2>注册页面</h2>
    <form action="/reg/" method="post">
        {% csrf_token %}
        <p>姓名:<input name="user" type="text"></p>
        <p>密码:<input name="pwd" type="text"></p>
        <input type="submit">
    </form>
    </body>
    </html>
    
    ###############set_pwd.html
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h2>修改密码:{{ request.user }} 用户</h2>
    <form action="/set_pwd/" method="post">
        {% csrf_token %}
        <p>密码:<input name="pwd" type="text"></p>
        {#<p>确认密码:<input name="pwd2" type="text"></p>#}
        <input type="submit">
    </form>
    </body>
    </html>
    
  • 相关阅读:
    Gitkraken使用教程
    request.getHeader中区分大小写参数
    MySql 中查询列表中添加序号
    解决windows 下mysql 表名自动转成小写的问题
    MYSQL服务无法启动,服务没有任何错误;解决方法
    idea中设置一键生成方法注释和类注释
    Windows10下安装MySQL8.0.21-64
    navicat连接mysql出现2059错误的解决方法
    解决tomca在eclipse中正常启动,在bin下启动闪退问题
    QT线程的结束
  • 原文地址:https://www.cnblogs.com/baolin2200/p/7929747.html
Copyright © 2020-2023  润新知