用户认证--auth模块实现
相关介绍
auth
auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
auth可以和admin模块配合使用, 快速建立网站的管理系统。
在INSTALLED_APPS中添加'django.contrib.auth'使用该APP, auth模块默认启用.
User
User是auth模块中维护用户信息的关系模式(继承了models.Model), 数据库中该表被命名为auth_user.
User表的SQL描述:
CREATE TABLE "auth_user" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"password" varchar() NOT NULL, "last_login" datetime NULL,
"is_superuser" bool NOT NULL,
"first_name" varchar() NOT NULL,
"last_name" varchar() NOT NULL,
"email" varchar() NOT NULL,
"is_staff" bool NOT NULL,
"is_active" bool NOT NULL,
"date_joined" datetime NOT NULL,
"username" varchar() NOT NULL UNIQUE
)
auth模块提供了很多API管理用户信息, 在必要的时候我们可以导入User表进行操作, 比如其它表需要与User建立关联时.
from django.contrib.auth.models import User
新建用户
建立user对象
user = User.objects.create_user(username, email, password)
需要调用save()方法新用户才会写入数据库
user.save()
auth模块不存储用户密码明文而是存储一个Hash值, 比如迭代使用Md5算法.
认证用户
先导入函数
from django.contrib.auth import authenticate
使用关键字参数传递账户和凭据:
user = authenticate(username=username, password=password)
认证用户的密码是否有效, 若有效则返回代表该用户的user对象, 若无效则返回None.
该方法不检查is_active
标志位.
修改密码
修改密码是User的实例方法, 该方法不验证用户身份:
user.set_password(new_password)
通常该方法需要和authenticate配合使用:
user = auth.authenticate(username=username, password=old_password)
if user is not None:
user.set_password(new_password)
user.save()
登录
首先import:
from django.contrib.auth import login
login向session中添加SESSION_KEY, 便于对用户进行跟踪:
'login(request, user)'
login不进行认证,也不检查is_active标志位, 一般和authenticate配合使用:
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
在auth/__init__.py
中可以看到login的源代码.
退出登录
logout会移除request中的user信息, 并刷新session:
from django.contrib.auth import logout def logout_view(request):
logout(request)
只允许登录的用户访问
@login_required修饰器修饰的view函数会先通过session key检查是否登录, 已登录用户可以正常的执行操作, 未登录用户将被重定向到login_url
指定的位置.
若未指定login_url参数, 则重定向到settings.LOGIN_URL
from django.contrib.auth.decorators import login_required
@login_required(login_url='/accounts/login/')
def my_view(request):
...
Group
django.contrib.auth.models.Group
定义了用户组的模型, 每个用户组拥有id和name两个字段, 该模型在数据库被映射为auth_group
数据表。
User对象中有一个名为groups
的多对多字段, 多对多关系由auth_user_groups
数据表维护。Group对象可以通过user_set
反向查询用户组中的用户。
我们可以通过创建删除Group对象来添加或删除用户组。
# add
group = Group.objects.create(name=group_name)
group.save()
# del
group.delete()
我们可以通过标准的多对多字段操作管理用户与用户组的关系:
用户加入用户组
user.groups.add(group)
或group.user_set.add(user)
用户退出用户组
user.groups.remove(group)
或group.user_set.remove(user)
用户退出所有用户组
user.groups.clear()
用户组中所有用户退出组
group.user_set.clear()
Permission
Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。
auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian
.
假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限。
检查用户权限
user.has_perm
方法用于检查用户是否拥有操作某个模型的权限:
user.has_perm('blog.add_article')
user.has_perm('blog.change_article')
user.has_perm('blog.delete_article')
上述语句检查用户是否拥有blog这个app中article模型的添加权限, 若拥有权限则返回True。
has_perm
仅是进行权限检查, 即是用户没有权限它也不会阻止程序员执行相关操作。
permission_required
修饰器可以代替has_perm
并在用户没有相应权限时重定向到登录页或者抛出异常。
# permission_required(perm[, login_url=None, raise_exception=False])
@permission_required('blog.add_article')
def post_article(request):
pass
每个模型默认拥有增(add), 改(change), 删(delete)权限。在django.contrib.auth.models.Permission
模型中保存了项目中所有权限。
该模型在数据库中被保存为auth_permission
数据表。每条权限拥有id ,name , content_type_id, codename四个字段。
管理用户权限
User和Permission通过多对多字段user.user_permissions
关联,在数据库中由auth_user_user_permissions
数据表维护。
添加权限:
user.user_permissions.add(permission)
删除权限:
user.user_permissions.delete(permission)
清空权限:
user.user_permissions.clear()
用户拥有他所在用户组的权限, 使用用户组管理权限是一个更方便的方法。Group中包含多对多字段permissions
, 在数据库中由auth_group_permissions
数据表维护。
添加权限:
group.permissions.add(permission)
删除权限:
group.permissions.delete(permission)
清空权限:
group.permissions.clear()
自定义权限
在定义Model时可以使用Meta自定义权限:
class Discussion(models.Model):
...
class Meta:
permissions = (
("create_discussion", "Can create a discussion"),
("reply_discussion", "Can reply discussion"),
)
判断用户是否拥有自定义权限:
user.has_perm('blog.create_discussion')
用户认证--auth模块实现的更多相关文章
- Django 2.0 学习(17):Django 用户认证(auth模块)
Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...
- Django【第9篇】:Django之用户认证auth模块
用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码 ...
- Django之用户认证—auth模块
用户认知———auth模块 目录: auth模块 User对象 实例 扩展默认的auth_user表 - 创建超级用户 - python3 manager.py createsuperuser - 认 ...
- Django自带的用户认证auth模块
一.介绍 基本上在任何网站上,都无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能. 使用Django,我们可以不需要自己写这些功能,因为Dj ...
- 用户认证--------------auth模块
一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...
- Django框架----用户认证auth模块
一.auth模块 auth模块:针对auth_user表 创建超级管理用户命令: Python manage.py createsuperuser添加用户名添加密码(至少8位)确认密码添加邮箱(可为空 ...
- Django之用户认证auth模块
一 Django中的auth模块: 我们在使用模块之前要先导入模块: from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介 ...
- 用户认证auth模块
一.auth模块 from django.contrib import auth 1 .authenticate() :验证用户输入的用户名和密码是否相同 提供了用户认证,即验证用户名以及密码是否 ...
- Django之用户认证auth模块使用
Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ...
随机推荐
- 如何在hanlp词典中手动添加未登录词
我们在使用hanlp词典进行分词的时候,难免会出现分词不准确的情况,原因是由于内置词典中并没有收录当前的这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作,下 ...
- linux nodejs
scp node-v8.15.0-linux-x64.tar.gz root@10.88.248.231:/lngoa tar -zxvf node-v8.15.0-linux-x64.tar.gz ...
- redis总结问题
简单回顾了redis,在这过程中 首先得了解redis是什么,redis的运用场景,redis支持哪些数据格式,redis如何操作数据,redis如何实现高可用 redis是什么: Redis 是一个 ...
- CSS之form&span
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 从OsChina Git下载项目到MyEclipse中
前提是,拥有权限下载 1.进入MyEclipse,点击File-->Import,选择Git,点击“Next”,如下图: , 2.选择“URI”,点击"Next" 3.输入项 ...
- Percona MySQL 5.7 Linux通用二进制包安装(CentOS 6)
Linux 安装 Percona http://blog.itpub.net/26506993/viewspace-2136501/ https://www.cnblogs.com/snowwhite ...
- [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较
java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0); 设置长度为0 2. buffer.delete(0, buffer.length() ...
- 关于javabean
[javabean定义]定义:JavaBeans是Java语言中可以重复使用的软件组件,实质上是一种特殊的Java类.特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属 ...
- 关于x-shell连接不上本地虚拟机linux
首先把虚拟机网络模式调成nat模式,用于共享主机的ip地址. 然后再虚拟机输入命令ifconfig查看虚拟机的ip 在windows下ping一下虚拟机的ip确保能ping通,同理在虚拟机下ping主 ...
- Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...