Django认证系统

Django自带的用户认证

不知道你们还有没有印象,在咱们执行完下面的两句命令后javascript

python3 manage.py makemigrations
python3 manage.py migrate

打开数据库会发现有不少并非咱们本身建立的数据表,auth模块就是用的Django默认用的自带的数据表来实现用户认证一系列功能html

接下来咱们就来用Django自带的auth_user表来看看auth模块的认证功能究竟是个啥java

auth模块

首先在你的views.py文件中导入python

from django.contrib import auth

authenticate()   

提供了用户认证,即验证用户名以及密码是否正确,通常须要username  password两个关键字参数算法

若是认证信息有效,会返回一个  User  对象。authenticate()会在User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登陆过程当中是须要的。数据库

当咱们试图登录一个从数据库中直接取出来不通过authenticate()的User对象时会报错!!!django

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个认证了的User对象后端

此函数使用django的session框架给某个已认证的用户附加上session id等信息。session

上述两个方法使用示例

这里用最简单的注册登陆示例来看看auth模块的上述两个功能,能帮咱们作些什么app

认证装饰login_required

既然有注册登陆以及校验,那么确定是有些网页只有注册登录了才能查看,那当咱们直接访问该页面时,咱们如何去判断这个用户是否是咱们的在线用户呢,以前咱们能够经过Django的中间件来对全局进行一个验证或者给须要注册登陆的视图函数加上装饰器,这里auth模块中也考虑到了这一点,为咱们提供了很方便的验证装饰器

1  用户登录后才能访问某些页面,

2  若是用户没有登陆就访问该页面的话直接跳到登陆页面

3  用户在跳转的登录界面中完成登录后,自动访问跳转到以前访问的地址

若用户没有登陆,则会跳转到django默认的 登陆URL '/accounts/login/ ' (这个值能够在settings.py文件中经过LOGIN_URL进行修改)。并传递当前访问url的绝对路径 (登录成功后,会重定向到该路径)。这一句的功能咱们以前也实现过,回想对比一下,仍是这个简单

settings.py文件中加上

LOGIN_URL='/login/'
后面的URL就是你本身写的对应的注册登陆路径

logout(request) 注销用户

from django.contrib.auth import logout
   
def logout_view(request):
  logout(request)
  # Redirect to a success page.

该函数接受一个HttpRequest对象,无返回值。当调用该函数时,当前请求的session信息会所有清除。该用户即便没有登陆,使用该函数也不会报错。

check_password(passwd)

用户须要修改密码的时候,首先要让其输入原来的密码 ,若是给定的值经过了密码检查,返回 True

set_password(new_password)

用户修改修改密码时,须要调用此方法来完成密码的修改

user = User.objects.get(username='')
user.set_password(password='')
user.save()

注销及修改密码示例

 

User对象

User 对象属性:username, password(必填项)password用哈希算法保存到数据库

is_staff : 用户是否拥有网站的管理权限.

is_active : 是否容许用户登陆, 设置为``False``,能够不用删除用户来禁止 用户登陆

is_authenticated()

若是是真正的 User 对象,返回值恒为 True 。 用于检查用户是否已经经过了认证。
经过认证并不意味着用户拥有任何权限,这个方法甚至也不检查该用户是否处于激活状态,只是代表用户成功的经过了认证。

这个方法很重要, 在后台用request.user.is_authenticated()判断用户是否已经登陆,若是true则能够向前台展现request.user.name

进阶

这内置的auth_user表这么好用,可是我在项目中无法直接使用啊!好比,我想要加一个存储用户手机号的字段,怎么办?

聪明的你可能会想到新建另一张表而后经过一对一和内置的auth_user表关联,这样虽然能知足要求可是有没有更好的实现方式呢?

答案是固然有了。

 

咱们能够经过继承内置的auth_user表的对应的类,来定义一个本身的ORM类。

注意!!!

定义本身的ORM类来使用auth认证模块,必定要在settings.py中告诉Django,我如今使用我新定义的UserInfo表来作用户认证。写法以下:

# 引用Django自带的User表,继承使用时须要设置
AUTH_USER_MODEL = "app名.UserInfo"
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

 结合上一篇咱们学的form组件和本篇学的auth认证,咱们来结合使用如下

settings.py中配置

对应的html文件不须要作任何修改

相关文章
相关标签/搜索