# Django中的用户认证
Django带有一个用户认证系统。它处理用户帐户,组,权限和基于cookie的用户会话。本文档的这一部分解释了默认实现如何开箱即用,以及如何[扩展和定制](https://docs.djangoproject.com/en/1.11/topics/auth/customizing/)它以适应您的项目需求。
[文档地址:https://docs.djangoproject.com/en/1.11/topics/auth/](https://docs.djangoproject.com/en/1.11/topics/auth/)
## 概述
Django认证系统处理认证和授权。简而言之,身份验证验证用户是他们自称的用户,并且授权决定允许经过身份验证的用户执行的操作。这里使用术语认证来指代这两个任务。
认证系统由以下部分组成:
* 用户
* 权限:指定用户是否可以执行特定任务的二进制(是/否)标志。
* 组:将标签和权限应用于多个用户的通用方法。
* 一个可配置的密码散列系统
* 表单和查看工具,用于登录用户或限制内容
* 可插入的后端系统
### 用户,组,认证 模型
[https://docs.djangoproject.com/en/1.11/ref/contrib/auth/](https://docs.djangoproject.com/en/1.11/ref/contrib/auth/)
用户操作
```
创建用户
User.objects.create_user()
# 创建普通用户
myuser = User.objects.create_user(
request.POST['username'],
request.POST['email'],
request.POST['password']
)
创建超级用户
User.objects.create_superuser(用户名,电子邮件,密码,** extra_fields)
# 创建超级用户
myuser = User.objects.create_superuser(
request.POST['username'],
request.POST['email'],
request.POST['password']
)
```
组操作
```
# 创建组
g = Group()
g.name = request.POST['name']
# 执行添加
g.save()
为组分配权限
prms = request.POST.getlist('prms',None)
# 添加权限
if prms:
ps = Permission.objects.filter(id__in=prms)
g.permissions.set(ps)
g.save()
为用户分配组
gs = Group.objects.filter(id__in=request.POST.getlist('groupid',None))
ob.groups.set(gs)
获取组
# 获取所有的组
ob = Group.objects.all()
# 获取当前组信息
ginfo = Group.objects.get(id=gid)
# 获取当前组下的所有权限
# ginfo.permissions.all()
```
权限操作
```
# 读取所有权限信息
Permission.objects.all()
# 读取所有权限信息,并排除以Can开头的系统默认生成权限
Permission.objects.exclude(name__istartswith='Can')
```
[检测用户是否登录,装饰器](https://docs.djangoproject.com/en/1.11/topics/auth/default/#the-login-required-decorator)
```
from django.contrib.auth.decorators import login_required
@login_required(login_url='/login/')
```
[检测用户权限,装饰器](https://docs.djangoproject.com/en/1.11/topics/auth/default/#the-permission-required-decorator)
```
from django.contrib.auth.decorators import permission_required
@permission_required('demo.add_goods',raise_exception=True)
```
[验证用户](https://docs.djangoproject.com/en/1.11/topics/auth/default/#django.contrib.auth.authenticate)
```
from django.contrib.auth import authenticate
user = authenticate(request, username=username, password=password)
```
[用户登录](https://docs.djangoproject.com/en/1.11/topics/auth/default/#how-to-log-a-user-in)退出
```
from django.contrib.auth import login,logout
用户登陆
login(request, user)
用户退出
logout(request)
```
获取用户及权限信息
```
# 获取当前会话的用户对象
obj = get_user(request)
# 获取当前用户拥有的所有权限
pms = obj.get_all_permissions()
# # 检查当前用户是否具有 perm 权限
# res = obj.has_perm('demo.add_types')
```
[自定义权限](https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#custom-permissions)
> 要为给定的模型对象创建自定义权限,请使用permissions 模型元属性。
>
> 此示例任务模型创建三个自定义权限,即用户可以使用或不能对Task应用程序执行的操作,这些操作特定于您的应用程序:
```
class Task(models.Model):
...
class Meta:
permissions = (
("view_task", "Can see available tasks"),
("change_task_status", "Can change the status of tasks"),
("close_task", "Can remove a task by setting its status as closed"),
)
```
模板中操作
```
获取当前会话用户
{ { request.user.username } }
获取当前会话用户权限 https://docs.djangoproject.com/en/1.11/topics/auth/default/#permissions
{ { perms } }
判断当前用户是否具有权限
{ % if request.user.is_superuser or 'demo.show_users' in perms % }
<li>用户管理</li>
{ % endif % }
```