20 -用户认证-auto

一. 概要

# auto模块是Django提供的标准权限管理系统,可以提供身份认证,用户组和权限管理
# 主要的操作包括:
'''
    1.create_user       创建用户
    2.authenticate      验证登录
    3.login             记住用户的登录状态
    4.logout            退出登录
    5.is authenticated  判断用户是否登录
    6.@login_required   判断用户是否登录的装饰器
'''

二. 配置

# 1. 创建模型类,继承: AbstractUser
  class User(AbstractUser):
    username = models.CharField(max_length=30, unique=True, null=False)
    password = models.CharField(max_length=128)
    class Meta:
        db_table = "user"

    '''
    数据库迁移指令
    python manage.py makemigrations
    python manage.py migrate
    '''


# 2. settings.py中指定认证系统路径
  AUTH_USER_MODEL='App02.User'


三.使用

注册 登录 退出登录 首页验证是否登录 修改密码 路由保护
3.0 路由
# urls.py
app_name="App02"
urlpatterns = [
    path('',views.index,name="index"), # 首页
    path('userregister/',views.user_register,name="userregister"), # 注册
    path('login/',views.user_login,name="login"),  # 登录
    path('logout/',views.user_logout,name="logout"), # 退出登录
    # 修改密码
    path('change/', views.change, name="change"),

    # 路由保护
    path('publish/',views.publish,name="publish"),

    path('test/',views.test_pass,name="test"), # 密码加密

]
3.1 注册
#  注册: 密码会做签名加密 : user=User.objects.create_user(**data)
def user_register(request):
    if request.method == "POST":
        form = RegisterForm(request.POST)  # 调用验证form
        if form.is_valid():
            data = form.cleaned_data
            data.pop("confirm")
            print(data, type(data))
            # 把用户写入数据库
            # 密码会做签名加密,不能手动签名加密password
            user = User.objects.create_user(**data)
            if user:
                return HttpResponse("注册成功")
            else:
                return render(request, "register.html", {"form": form})
        else:
            return render(request, "register.html", {"form": form})

    # get请求
    return render(request, "register.html")

3.2 登录
# 登录: login(request, user)
@csrf_exempt
def user_login(request):
    if request.method == 'POST':
        user = request.POST.get("username", '')
        pwd = request.POST.get("password", '')
        # 用户验证,如果用户名和密码正确,返回User的对象,否则返回None
        user = authenticate(request, username=user, password=pwd)
        if user:
            # 记录用户登录状态,参数是请求对象和用户对象
            login(request, user)
            return redirect(reverse('App02:index'))
        else:
            return render(request, 'login.html', {"msg": "用户名或密码错误"})

    return render(request, 'login.html')
<body>
<h2>{{ msg }}</h2>
<form action="{% url 'App02:login' %}" method="post">
    {% csrf_token %}
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
</form>
</body>
3.3 退出登录
# 退出登录:  logout(request)
def user_logout(request):
    # 退出登录
    logout(request)
    return redirect(reverse('App02:index'))
3.4 首页
# 首页: is_authenticated:判断是否登录
def index(request):
    # is_authenticated: 在后端判断是否登录,登录为True,不登录为False
    print(request.user.is_authenticated)
    return render(request, "index.html")
<body>
{% if request.user.is_authenticated %}
    {{ request.user.username }} <a href="{% url 'App02:logout' %}">退出登录</a>
{% else %}
    你还没登录,请先登录<a href="{% url 'App02:login' %}">登录</a>
{% endif %}
</body>
3.5 修改密码
# 修改密码: user.set_password("123")
def change(request):
    # 修改密码
    user = User.objects.get(pk=1)
    user.set_password("123")
    user.save()
    return HttpResponse("修改密码"
3.6 路由保护
# 路由保护 : login_url:没登录跳转
@login_required(login_url="/login/")
def publish(request):
    return HttpResponse("发表文章")

# 或者不在 @ login_required() 中配置未登录跳转页面,在settings.py中配置
  # 登录页面地址
  LOGIN_URL = "/login/"
3.7密码加密
# 1. settings.py配置
    # 密码配置
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]


# 2. 视图函数加密
  def test_pass(request):
    password = make_password("123")  # 对密码加密
    print(password)
    print(check_password("123", password))  # 验证密码,密码正确返回True,否则False
    return HttpResponse("ok")
  
posted @ 2023-03-28 18:31  测试圈的彭于晏  阅读(38)  评论(0)    收藏  举报