drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用
三大认证工作原理简介
认证、权限、频率
源码分析:
from rest_framework.views import APIView
源码分析入口:
内部的三大认证方法封装:
三大组件的原理分析:
权限六表分析
基于用户权限访问控制的认证(RBAC):Role-Based-Access-Control;基于auth的认证规则(了解)。
Django框架采用的是RBAC认证规则:通常分为:三表规则、五表规则、Django采用的是六表规则。
三表:用户表、角色表、权限表
五表:用户表、角色表、权限表、用户角色关系表、角色权限关系表、用户权限关系表
六表:用户表、角色表、权限表、用户角色关系表、角色权限关系表、用户权限关系表
源码分析三者的关系
用户表:角色groups,权限user_permissions
角色表:用户user_set,权限permissions
权限表:用户user_set,角色group_set
重点:如果自定义User表后,再另一个项目中采用原生User表,完成数据库迁移时,可能失败。
解决的办法:
(1)、卸载Django,重新安装(源码问题)
(2)、将django.contrib下面的admin、auth下的数据迁移记录文件全部清空
from django.contrib.auth.models import AbstractUser,User
创建自定义User表
models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
mobile = models.CharField(max_length=11, unique=True)#设置成唯一的
class Meta:
db_table = 'api_user'
verbose_name = '用户表'
verbose_name_plural = verbose_name def __str__(self):
return self.username
数据库迁移:
>> python3 manage.py makemigrations >> python3 manage.py migrate >> #创建超级用户 >>> python3 manage.py createsuperuser >> admin admin123
配置自定义user表
在settings.py下面输入,告诉django系统自己创建自定义的用户表。
AUTH_USER_MODEL = "api/User"
创建好的三表结构
脚本启动测试查询数据
# django脚本话启动
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dg_proj.settings")
django.setup() from api import models
user = models.User.objects.first() # type: models.User
print(user.username)
print(user.groups.first().name)
print(user.user_permissions.first().name)
from django.contrib.auth.models import Group
group = Group.objects.first()
# print(group.name)
# print(group.user_set.first().username)
# print(group.permissions.first().name)
认证组件的源码分析
点击进去,逐一分析,第一个分析的是,认证组件,
def perform_authentication(self, request):
需要点击定位到request下面的user方法继续往下查看其内部的封装原理。
内部user的方法:调用了self._authenticare()封装的方法。
点击 self._authenticate查看认证源码的精髓实现认证的部分。
最后分析得出认证类的配置文件
再通过导入模块,查看内部封装认证的原理
from rest_framework.authentication import BaseAuthentication
from rest_framework.authentication import SessionAuthentication
分析BaseAuthentication 和 SessionAuthentication。
自定义认证模块
新建一个文件夹,来写自定义的认证模块,authentications.py
分析以上源码后,总结该如何书写自定义认证模块的功能
# 自定义认证类
# 1)继承BaseAuthentication类 # 2)重新authenticate(self, request)方法,自定义认证规则 # 3)认证规则基于的条件:
# 没有认证信息返回None(游客)
# 有认证信息认证失败抛异常(非法用户)
# 有认证信息认证成功返回用户与认证信息元组(合法用户) # 4)完全视图类的全局(settings文件中)或局部(确切的视图类)配置
认证Authentication
可以在配置文件中配置全局默认的认证方案
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', # 基本认证
'rest_framework.authentication.SessionAuthentication', # session认证
)
}
也可以在每个视图views,py中通过设置authencation_classess属性来配置
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView class ExampleView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
...
认证失败会有两种可能的返回值:
>>> 401 Unauthorized 未认证
>>> 403 Permission Denied 权限被禁止
书写自定义的认证组件
api/authentications.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from . import models
class MyAuthentication(BaseAuthentication):
def authenticate(self, request):
# 前台在请求头携带认证信息,
# 且默认规范用 Authorization 字段携带认证信息,
# 后台固定在请求对象的META字段中 HTTP_AUTHORIZATION 获取
auth = request.META.get('HTTP_AUTHORIZATION', None) # 处理游客
if auth is None:
return None # 设置一下认证字段小规则(两段式):"auth 认证字符串"
auth_list = auth.split() # 校验合法还是非法用户
if not (len(auth_list) == 2 and auth_list[0].lower() == 'auth'):
raise AuthenticationFailed('认证信息有误,非法用户') # 合法的用户还需要从auth_list[1]中解析出来
# 注:假设一种情况,信息为abc.123.xyz,就可以解析出admin用户;实际开发,该逻辑一定是校验用户的正常逻辑
if auth_list[1] != 'abc.123.xyz': # 校验失败
raise AuthenticationFailed('用户校验失败,非法用户') user = models.User.objects.filter(username='admin').first() if not user:
raise AuthenticationFailed('用户数据有误,非法用户')
return (user, None) # 登录:账号密码 => token(账号密码对应的用户)
# 访问需要登录的接口:携带token发送请求 => 校验token,得到用户
views.py
from rest_framework.views import APIView class TestAPIView(APIView):
def get(self, request, *args, **kwargs):
# 如果通过了认证组件,request.user就一定有值
# 游客:AnonymousUser
# 用户:User表中的具体用户对象
print(request.user)
return APIResponse(0, 'test get ok')
postman测试时需要注意的点
用post请求在Headers的key:Authoriaztion,内携带认证数据返送个后端。
系统权限类
权限Permissions
权限控制可以限制用户对于视图的访问和对于具体数据对象的访问
在执行视图的dispatch()方法前,会先进行视图访问权限的判断
在通过get_object()获取具体对象时,会进行模型对象访问权限的判断
源码解析
源码分析:
得出权限配置的settings
AllowAny内部封装
内部权限校验的其他方法
"""
1)AllowAny:
认证规则全部返还True:return True
游客与登陆用户都有所有权限 2) IsAuthenticated:
认证规则必须有登陆的合法用户:return bool(request.user and request.user.is_authenticated)
游客没有任何权限,登陆用户才有权限 3) IsAdminUser:
认证规则必须是后台管理用户:return bool(request.user and request.user.is_staff)
游客没有任何权限,登陆用户才有权限 4) IsAuthenticatedOrReadOnly
认证规则必须是只读请求或是合法用户:
return bool(
request.method in SAFE_METHODS or
request.user and
request.user.is_authenticated
)
游客只读,合法用户无限制
"""
api/views.py 举例校验
from rest_framework.permissions import IsAuthenticated
class TestAuthenticatedAPIView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, *args, **kwargs):
return APIResponse(0, 'test 登录才能访问的接口 ok') # 因为默认全局配置的权限类是AllowAny
# settings.py
REST_FRAMEWORK = {
# 权限类配置
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
],
}
自定义的权限类
分析:
"""
1) 创建继承BasePermission的权限类
2) 实现has_permission方法
3) 实现体根据权限规则 确定有无权限
4) 进行全局或局部配置 认证规则
i.满足设置的用户条件,代表有权限,返回True
ii.不满足设置的用户条件,代表有权限,返回False
"""
utils/permissions.py
from rest_framework.permissions import BasePermission
from django.contrib.auth.models import Group
class MyPermission(BasePermission):
def has_permission(self, request, view):
# 只读接口判断
r1 = request.method in ('GET', 'HEAD', 'OPTIONS')
# group为有权限的分组
group = Group.objects.filter(name='管理员').first()
# groups为当前用户所属的所有分组
groups = request.user.groups.all()
r2 = group and groups
r3 = group in groups
# 读接口大家都有权限,写接口必须为指定分组下的登陆用户
return r1 or (r2 and r3)
views.py
# 游客只读,登录用户只读,只有登录用户属于 管理员 分组,才可以增删改
from utils.permissions import MyPermission
class TestAdminOrReadOnlyAPIView(APIView):
permission_classes = [MyPermission]
# 所有用户都可以访问
def get(self, request, *args, **kwargs):
return APIResponse(0, '自定义读 OK')
# 必须是 自定义“管理员”分组 下的用户
def post(self, request, *args, **kwargs):
return APIResponse(0, '自定义写 OK')
使用权限认证配置
可以在配置文件中设置默认的权限管理类,如:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
如果为指明,则采用如下默认配置
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
也可以在具体的视图中通过permissions_classes属性来设置,如
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView class ExampleView(APIView):
permission_classes = (IsAuthenticated,)
...
提供的权限有一下几种
"""
- AllowAny 允许所有用户
- IsAuthenticated 仅通过认证的用户
- IsAdminUser 仅管理员用户
- IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。 """
举例
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import RetrieveAPIView class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsAuthenticated]
drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用的更多相关文章
- 【Spring Security】六、自定义认证处理的过滤器
这里接着上一章的自定义过滤器,这里主要的是配置自定义认证处理的过滤器,并加入到FilterChain的过程.在我们自己不在xml做特殊的配置情况下,security默认的做认证处理的过滤器为Usern ...
- drf三大组件之认证组件与权限组件
复习 """ 视图家族 1.视图类:APIView.GenericAPIView APIView:作为drf的基础view:as_view()禁用csrf:dispatc ...
- drf认证组件(介绍)、权限组件(介绍)、jwt认证、签发、jwt框架使用
目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...
- DRF认证、自定义认证和权限、自定义权限
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...
- drf三大认证
源码分析 """ 1)APIView的dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial( ...
- 7) 项目准备流程 和 django权限六表
一.项目准备 1. 创建django项目 2. 创建数据库 —— init文件中声明mysql —— settings中配置数据库 import pymysql pymysql.install_as_ ...
- drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)
目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...
- 8) drf 三大认证 认证 权限 频率
一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...
- drf三大组件之频率认证组件
复习 """ 1.认证组件:校验认证字符串,得到request.user 没有认证字符串,直接放回None,游客 有认证字符串,但认证失败抛异常,非法用户 有认证字符串, ...
随机推荐
- C++使用 scanf函数
最近看了下C++,有些地方和c语言 还是不太一样的,当我在做输入一个数字的时候发现了错误.. 所以在使用scanf()的时候需要加下面这段在头文件 顶部: #define _CRT_SECURE_N ...
- VS2012中MFC 操作mshflexgrid插入图片
CPictureHolder pic,picSection; pic.CreateFromBitmap(IDB_BITMAP); LPDISPATCH pPic = pic.GetPictureDis ...
- 重新修改AD中PCB的形状快捷键
Altium Designer 快速修改板子形状为Keep-out layer大小 1,切换到 Keep-out layer层, 2,选择层,快捷键为S+Y: 3,设计-板子形状-按照选择 ...
- 资源的合并与压缩-html压缩
资源的合并:减少http请求数量 资源的压缩:减少请求资源的大小 html压缩 html代码压缩就是压缩这些在文本文件中有意义,但是在html中不显示的字符,包括空格,制表符,换行符等,还有一些其他意 ...
- web应用中并发控制的实现,各种锁的集合
参考:http://blog.csdn.net/xiangwanpeng/article/details/55106732 B/S构架的应用越来越普及,但由于它有别于C/S构架的特殊性,并发控制始终没 ...
- POJ-3629 模拟
A - Card Stacking Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- GPU 、APU、CUDA、TPU、FPGA介绍
购买显卡主要关注:显存.带宽和浮点运算数量 GPU :图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心.视觉处理器.显示芯片,是一种专门在个人电脑. ...
- html_位置偏移属性position
定位属性 位置属性position:static.relative.absolute.fixed 偏移属性:top.bottom.left.right 浮动定位属性:float/clear 1.浮动定 ...
- Q7:Reverse Integer
7. Reverse Integer 官方的链接:7. Reverse Integer Description : Given a 32-bit signed integer, reverse dig ...
- no.9亿级用户下的新浪微博平台架构读后感
微博平台的第三代技术体系,使用正交分解法建立模型:在水平方向,采用典型的三级分层模型,即接口层.服务层与资源层:在垂直方向,进一步细分为业务架构.技术架构.监控平台与服务治理平台. 水平分层 (1)接 ...