欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

django中的auth详解

程序员文章站 2022-04-28 10:28:28
Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能, Django它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用 ......

 auth模块是什么

auth模块是django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,

 django它内置了强大的用户认证系统--auth,它默认使用 auth_user 表来存储用户数据。

1auth使用

1 在views导入auth模块

    from django.contrib import  auth

 

2 配置mysql数据库,进行数据迁移

         makemigration

         migrate

3 创建超级用户

 

manage.py@author > createsuperuser

username (leave blank to use 'administrator'):  lifujina

email address:                                             邮箱不用填

password:  88888888li

password (again):  88888888li

superuser created successfully.

 

 

 

 

 

 

 

 

 

2 auth模块常用方法

认证用户

auth.authenticate(username=name,password=pwd)

在视图层

 

 

 1  from django.shortcuts import render,httpresponse
 2 
 3 
 4 
 5 # create your views here.
 6 
 7 from django.contrib import  auth
 8 
 9 
10 
11 def login(request,*args,**kwargs):
12 
13 
14 
15     if request.method == "get":
16 
17         return render(request,"login.html")
18 
19 
20 
21     if request.method == "post":
22 
23         name = request.post.get("name")
24 
25         pwd = request.post.get("pwd")
26 
27 
28 
29         user = auth.authenticate(username=name,password=pwd)    认证密码和用户在数据库中
30                                                                 #username  password 不能写成其他
31 
32         if user:
33 
34             return httpresponse("登录成功")
35 
36         return httpresponse("登录失败")

 

 

前端


<body>
<form action="/login/" method="post">
    <input type="text" name = "name">
    <input type="password" name = "pwd">
    <input type="submit" value="登录">
</form>
</body>

 

 

auth.authenticate (username=name,password=pwd) 

认证用户名和密码是否存在

 

用户登录

 

auth.login(request, user)

 


user = auth.authenticate(username=name,password=pwd)
if user:
    auth.login(request,user=user)    注意是俩个参数,一个是request,一个是登录的用户
    #用户登录
    #user 是当前认证通过的user
    #会在生成一个随机字符串,并存在session中
    return httpresponse("登录成功")
return httpresponse("登录失败")

 

 

3   获得当前登录用户

request.user

 

def login(request,*args,**kwargs):

    if request.method == "get":
        return render(request,"login.html")

    if request.method == "post":
        name = request.post.get("name")
        pwd = request.post.get("pwd")

        user = auth.authenticate(username=name,password=pwd)
        if user:
            auth.login(request,user=user)
            #用户登录
            #user 是当前认证通过的user
            #会在生成一个随机字符串,并存在session中
            usr = request.user
            #当前登录用户,但是一个要在登录后才能拿到,
如果没有登录显示匿名用户
request.user = anonymoususer
      #当前登录用户,不仅可以在后台能拿到,前台也能拿到
            print(usr)
            return httpresponse("登录成功")
        return httpresponse("登录失败")

 

 

用户退出登录

logout(request) 

 

def logout(request):
    auth.logout(request)       一定注意有个request参数
相当于执行了:request.session.flush()
    return redirect("/login/")

 

 

登录认证装饰器(控制用户,没有登录不能访问某个连接)

@login_required(redirect_field_name="eee",login_url="/login/")

 导入 login_required模块
from  django.contrib.auth.decorators  import  login_required
 
局部认证:(直接加在被认证的函数上面)
@login_required(redirect_field_name="eee",login_url="/login/")
 
redirect_field_name="eee", 修改路径上?后的key值

 
login_url=”/login/”  在没有登录的情况下,访问test要跳转的页面

def test(request,*args,**kwargs):
    return render(request,"test.html")
 
 
全局认证:(在settings中配置)
 
login_url = “/login/”只要没有登录的直接访问,跳到login页面
 
 
@login_required()                     这里的参数就不用再写了
def test(request,*args,**kwargs):
    return render(request,"test.html")
 

 

创建超级用户和普通用户

 

logout(request) 

 

from django.contrib.auth.models import user       一定要导入 
def register(request,*args,**kwargs):
    name = 'egon'
    pwd = "123"

    user = user.objects.create_user(username=name,password=pwd)   
username  password 不能写错
    sup_user = user.objects.create_superuser(username=name,password = pwd)

    return httpresponse("注册成功")

 

1 导入from django.contrib.auth.models  import user 下的 user

创建普通用户 超级用户

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

校验密码是否正确(check_password(password)

check_password(password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回true,否则返回false。

用法:

ok = user.check_password('密码')

 

def check_password(request,*args,**kwargs):
    pwd = "123"#应该是前台将密码传过来

    res = request.user.check_password(pwd)
          #注意是校验当前登录用户的密码(request.user为当前登录用户)
    if res:
     return httpresponse("ok")
    return httpresponse("密码错误")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

修改密码

set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

 

def chang_password(request,*args,**kwargs):

    pwd = "123"
    user = request.user                       #获得当前登录用户
    user.set_password(pwd)           #当前登录用户,调用 set_password(pwd) 修改密码的 方   法                                           pwd 为新密码
    user.save()                                 # 一定要记得保存 save()

    return httpresponse("ok")

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9  判断当前用户有没有登录

 

is_authenticated()

 

def user_pass(request,*args,**kwargs):

    user = request.user.is_authenticated() 
#requset.user为当前登录用户,如果登录了,user值为true
没登录            user 为false
    print(user)
    return httpresponse("ok")

 

10  其他方法

 

request.user.is_staff() :

用户是否拥有网站的管理权限. (设为false  不能登录admin)

 request.user.is_active() :

是否允许用户登录, 设置为 false,可以在不删除用户的前提下禁止用户登录。(设为false,用户还存在,但是不能登录,封号)

 

 

 

 

 

 

 

 

2   auth_user 增加自定义字段

1 自定义一个类   继承abstractuser

from django.contrib.auth.models import abstractuser

class userinfo(abstractuser):
     #继承了 abstractuser(auth  中的 user 其实就是继承了abstractuser )拥有父类的所有字段
    phone = models.bigintegerfield(max_length=11,null=true)   #并派生了 我们自己的 的  字段

    sex = models.booleanfield()
    #括号内 不能写null=true
    #这个字段是布尔类型    0 就代表false   1 代表ture

 

 

2 在settings  中配置 auth_user_model

 

auth_user_model = "appo.userinfo"    #注意   是appo.userinfo  而不是   appo.models.userinfo

#是字典的形式   这句话 意思  就是  以后的 auth_user  就  用 appo.userinfo

 

3 在要使用 userinfo 的地方 导入 userinfo

# from django.contrib.auth.models import user
 
from appo.models import userinfo
def register(request,*args,**kwargs):
    name = 'egon'
    pwd = "123"
    sex = 0

    user = userinfo.objects.create_user(username=name,password=pwd,sex=sex)
    # sup_user = user.objects.create_superuser(username=name,password = pwd)

    return httpresponse("注册成功")

 

注意: 这样数据库中就没有 auth_user这个表了,而是由userinfo取代了,以后凡是要用到user的地方 都用userinfo 替代, auth 所具有的方法,使用方式一样