热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DjangoREST框架详解07|三大认证与权限六表

文章目录一、三大认证1.认证组件:校验用户2.权限组件:校验用户权限3.频率组件:限制视图接口被访问次数4.分析源码二、权限六表1.RBA

文章目录

    • 一、三大认证
        • 1. 认证组件:校验用户
        • 2. 权限组件:校验用户权限
        • 3. 频率组件:限制视图接口被访问次数
        • 4. 分析源码
    • 二、权限六表
        • 1. RBAC 认证
        • 2. 权限三表
        • 3. 权限五表
        • 4. 权限六表
    • 三、六表间访问
        • 1. 分析源码
        • 2. 六表间访问方法
        • 3. 代码实现
        • 4. 脚本化启动查看表


一、三大认证


1. 认证组件:校验用户


  • 游客:无认证信息,校验通过,直接进入下一步权限认证校验
  • 合法用户:带正确认证信息,校验通过,将用户存储在 request.user 中,再下一步权限认证校验
  • 非法用户:带错误认证信息,校验失败,抛出异常,返回 403 权限异常结果

详细:Django REST 框架详解 08 | 认证组件

2. 权限组件:校验用户权限


  • 必须登录
  • 所有用户
  • 登录读写,游客只读
  • 自定义用户角色

认证通过:可以进入下一步校验(频率认证)

认证失败:抛出异常,返回 403

详细:Django REST 框架详解 09 | 权限组件

3. 频率组件:限制视图接口被访问次数


  • 限制的条件:IP,userid,唯一键(如手机号)
  • 频率周期时间:s,m,h,d
  • 频率的次数:3/h

没有达到限次:正常访问

达到限次:限制时间内不能访问,返回500,限制时间达到后,可以重新访问

详细:Django REST 框架详解 10 | 频率认证组件

4. 分析源码

class APIView(View):# ...def initial(self, request, *args, **kwargs):"""Runs anything that needs to occur prior to calling the method handler."""self.format_kwarg = self.get_format_suffix(**kwargs)# Perform content negotiation and store the accepted info on the requestneg = self.perform_content_negotiation(request)request.accepted_renderer, request.accepted_media_type = neg# Determine the API version, if versioning is in use.version, scheme = self.determine_version(request, *args, **kwargs)request.version, request.versioning_scheme = version, scheme# Ensure that the incoming request is permitted# 认证组件:校验用户self.perform_authentication(request)# 权限组件:校验用户权限self.check_permissions(request)# 频率组件:限制视图接口被访问次数self.check_throttles(request)

二、权限六表

基于用户角色权限访问的控制 (RBAC,Role Based Access Control):Django 框架使用

基于 auth 认证:ThinkPHP 使用

1. RBAC 认证

RBAC 认证规则通常会分为 三表规则,五表规则,Django 采用六表规则

2. 权限三表

用户表,角色表,权限表

User

idnameg_id
1小明1
2小白2
3小红2,3

Group

idnamep_id
1校长1
2讲师1,2,3
3助教1,3

Permission

idname
1管理
2授课
3答疑
4财务

3. 权限五表

会发现权限三表中,User 表与 Group 表多对多关系, Group 表与 Permission 表是多对多关系。所以,需要新建这两张的关系表,这就是权限五表。

用户表,角色表,权限表,用户角色关系表,角色权限关系表

U-G关系表

idu_idg_id
111
222
332
433

G-P关系表

idg_idp_id
111
221
322
423
531
633

User

idname
1小明
2小白
3小红

Group

idname
1校长
2讲师
3助教

Permission

idname
1管理
2授课
3答疑

4. 权限六表

有的用户可能会执行角色分组以外的权限,所以除了五表外,多了用户表与权限表的关系表。

用户表,角色表,权限表,用户角色关系表,角色权限关系表,用户权限关系表。

U-P关系表

idu_idp_id
114
224
334

三、六表间访问


1. 分析源码

auth/models.py

class PermissionsMixin(models.Model):"""Add the fields and methods necessary to support the Group and Permissionmodels using the ModelBackend."""is_superuser = models.BooleanField(_('superuser status'),default=False,help_text=_('Designates that this user has all permissions without ''explicitly assigning them.'),)# 用户-角色关系表groups = models.ManyToManyField(Group,verbose_name=_('groups'),blank=True,help_text=_('The groups this user belongs to. A user will get all permissions ''granted to each of their groups.'),related_name="user_set",related_query_name="user",)# 用户-权限关系表user_permissions = models.ManyToManyField(Permission,verbose_name=_('user permissions'),blank=True,help_text=_('Specific permissions for this user.'),related_name="user_set",related_query_name="user",)

auth/models.py

class Group(models.Model):# 角色-权限关系表name = models.CharField(_('name'), max_length=150, unique=True)permissions = models.ManyToManyField(Permission,verbose_name=_('permissions'),blank=True,)

2. 六表间访问方法

用户表:访问角色 groups, 访问权限 user_permissions
角色表:访问用户 user_set, 访问权限 permissions
权限表:访问用户 user_set, 访问角色 group_set

3. 代码实现

自定义用户表 models.py

class User(AbstractUser):mobile = models.CharField(max_length=11, unique=True)class Meta:db_table = 'api_user',verbose_name = '用户表',verbose_name_plural = verbose_namedef __str__(self):return self.username

数据库迁移

python manage.py makemigrations
python manage.py migrrate

迁移报错解决

如果自定义 User 表后,在另一个项目中采用原生 User 表,完成数据库迁移时,可能会失败
解决:

  1. 卸载 Django 重新装
  2. 清空数据库迁移记录文件
    django.contrib.admin.migraions 清空除了 init.py 以外的文件
    django.contrib.auth.migraions 清空除了 init.py 以外的文件

创建成功后数据库表如下:
mark

4. 脚本化启动查看表

# django 脚本化启动
import os, djangoos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_proj02.settings')
django.setup()from api import models
user = models.User.objects.first()
# 用户
print(user.username)
# 用户-角色
print(user.groups.first())
# 用户-权限
print(user.user_permissions.first().name)print("-"*20)
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)print("-"*20)
from django.contrib.auth.models import Permission
p_1 = Permission.objects.filter(pk=1).first()
# 权限-用户
print(p_1.user_set.first().username)
p_2 = Permission.objects.filter(pk=2).first()
# 权限-角色
print(p_2.group_set.first().name)


推荐阅读
  • JSP 从入门到精通
    .body{textalign:center;}什么是URIURLURN?URI全称统一资源标识符,现在有两个方案,就是URL和URN.URL统一资源定位符,通常由scheme,d ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 移动传感器扫描覆盖摘要:关于传感器网络中的地址覆盖问题,已经做过很多尝试。他们通常归为两类,全覆盖和栅栏覆盖,统称为静态覆盖 ... [详细]
  • 代码如下:Stringpathrequest.getContextPath();StringbasePathrequest.getScheme():request ... [详细]
  • 目录爬虫-基础知识+requests库1.状态返回码2.URL各个字段解释2.requests库3.requests库爬虫的基本流程 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Request对象和Response对象request:(请求)当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象。Djang ... [详细]
author-avatar
springzhe7943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有