天天看点

Django(part48)--用户认证系统

学习笔记,仅供参考

文章目录

  • ​​用户认证系统​​
  • ​​User模型类​​
  • ​​auth基本模型操作​​
  • ​​创建用户​​
  • ​​删除用户​​
  • ​​修改密码​​
  • ​​检查密码是否正确​​

用户认证系统

Django自带一个用户认证系统,它处理用户账号、组、权限以及基于cookie的用户会话。

  • 作用
  • 添加普通用户和超级用户
  • 修改密码
  • 登陆和退出管理
  • 查看已登陆用户

User模型类

  • auth应用

现在,我们看一下mybookstore数据库下的数据表:

mysql> show tables;
+----------------------------+
| Tables_in_mybookstore      |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| bookstore_book             |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| userinfo_user              |
+----------------------------+
12 rows in set (0.00 sec)      

我们知道Django对这些数据表的命名规则为​

​应用名_类名​

​,由上面的输出结果,我们发现前6个数据表都是以auth为开头的,这是因为Django自动的给我们创建了一个应用auth,这是一个用户验证的APP,在它的models.py模块中有一个User模型类,我们可以导入该类,帮助我们完成用户验证的工作。

  • User模型类的导入
from django.contrib.auth.models import User      
  • User对象的基本属性
属性名 类型 是否必须存在
username 用户名
password 密码
email 邮箱 可选
first_name 可选
last_name 可选
is_superuser 是否是管理员(超级用户)帐号(/admin) 可选
is_staff 是否可以访问admin管理界面 可选
is_active

是否是活跃用户,默认True。

服务器端一般不会轻易删除用户,而是将用户的is_active设为False,这样用户将处于不可用状态。

可选
last_login 上一次的登录时间 可选
date_joined 用户创建的时间 可选

还记得我们在学习admin后台数据库管理时的一条创建管理员帐号的命令么:

python manage.py createsuperuser      

这条命令其实就相当于创建了一个User对象,即在mysql的auth_user数据表中添加了一条用户记录.

  • 数据库的表现形式

现在,我们看一下mysql中的auth_user数据表:

mysql> desc auth_user;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| password     | varchar(128) | NO   |     | NULL    |                |
| last_login   | datetime(6)  | YES  |     | NULL    |                |
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |
| username     | varchar(150) | NO   | UNI | NULL    |                |
| first_name   | varchar(30)  | NO   |     | NULL    |                |
| last_name    | varchar(150) | NO   |     | NULL    |                |
| email        | varchar(254) | NO   |     | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| date_joined  | datetime(6)  | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
11 rows in set (0.02 sec)      

可以看到id为11位的整形,password最多可以存储128个字符,username最多可以存储150个字符等等…

auth基本模型操作

创建用户

  • 创建普通用户create_user
from django.contrib.auth import models
user = models.User.objects.create_user(username='用户名', password='密码', email='邮箱',...)
...
user.save()      
  • 创建超级用户create_superuser
from django.contrib.auth import models
user = models.User.objects.create_superuser(username='用户名', password='密码', email='邮箱',...)
...
user.save()      

删除用户

from django.contrib.auth import models
try:
    user = models.User.objects.get(username='用户名')
    user.is_active = False  
    #使当前用户无效
    user.save()
    print("删除普通用户成功!")
except:
    print("删除普通用户失败")      

修改密码

from django.contrib.auth import models
try:
    user = models.User.objects.get(username='用户名')
    user.set_password('新密码')
    #Django会利用set_password方法对新密码进行加密
    #所以,我们不能用user.password的方法修改密码
    user.save()
    return HttpResponse("修改密码成功!")
except:
    return HttpResponse("修改密码失败!")      

检查密码是否正确

from django.contrib.auth import models
try:
    user = models.User.objects.get(username='用户名')
    if user.check_password('输入的密码'):  
        #成功返回True,失败返回False
        #Django会先对输入的密码进行加密
        #然后再对保存在数据库中的加密后密码进行比较
        return HttpResponse("密码正确")
    else:
        return HttpResponse("密码错误")
except:
    return HttpResponse("没有此用户!")