RBAC
基于用户权限访问控制的认证 - Role-Based Access Control
Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则、五表规则,Django采用的是六表规则
- 三表规则: 用户表、角色表、权限表
- 五表规则: 用户表、角色表、权限表、用户角色关系表、角色权限关系表
- 六表规则: 用户表、角色表、权限表、用户角色关系表、角色权限关系表、用户权限关系表
django六表跨表查询
- 用户表 -> 角色表 正向 groups,用户表 -> 权限 正向 user_permissions
- 角色表 -> 用户表 反向 user_set,角色表 -> 权限 正向 permissions
- 权限表 -> 用户表 反向 user_set,权限表 -> 角色表 反向 group_set
重点补充:如果自定义User表后,再另一个项目中采用原生User表,完成数据库迁移时,可能失败
- 卸载Django重新装
- 将django.contrib下面的admin、auth下的数据库迁移记录文件清空
三大认证组件
源码
APIView的dispath(self, request, *args, **kwargs)
dispath方法内 self.initial(request, *args, **kwargs) 进入三大认证
def initial(self, request, *args, **kwargs):
...
# 认证组件
self.perform_authentication(request)
# 权限组件
self.check_permissions(request)
# 频率组件
self.check_throttles(request)
认证组件:
校验用户 - 游客、合法用户、非法用户
- 游客:代表校验通过,直接进入下一步校验(权限校验)
- 合法用户:代表校验通过,将用户存储在request.user中,再进入下一步校验(权限校验)
- 非法用户:代表校验失败,抛出异常,返回403权限异常结果
权限组件:
校验用户权限 - 必须登录、所有用户、登录读写游客只读、自定义用户角色
- 认证通过:可以进入下一步校验(频率认证)
- 认证失败:抛出异常,返回403权限异常结果
频率组件:
限制视图接口被访问的频率次数 - 限制的条件(IP、id、唯一键)、频率周期时间(s、m、h)、频率的次数(3/s)
- 没有达到限次:正常访问接口
- 达到限次:限制时间内不能访问,限制时间达到后,可以重新访问
请求响应流程步骤:
- 前端发送请求到达后端DRF
- Django的Wsgi将request格式化成字典
- 请求走APIView的as_view,禁用CSRF,再走APIView的dispatch方法
- 请求模块,二次封装request
- 解析模块,解析countType
- 三大认证 认证组件,根据前端传来的认证信息校验出 游客 登录用户 非法用户
- 三大认证 权限组件,根据合法用户的不同身份给不同的权限
- 三大认证 频率组件,为接口设置频率限制
- 进入视图类,完成代码逻辑
- 异常模块:若三大认证或视图类有异常则进入, 该模块返回值为None,异常未被DRF处理, 返回值为有值,异常被DRF处理
- 响应模块, 将封装的响应信息交由View类中as_view的view方法返回给前台
登录接口流程:
前端 --> 请求 --> 后端(登录接口局部禁用认证和权限认证) --> 视图类中根据username和pwd获取用户对象 --> 根据用户对象生成认证信息 token --> 将token返回给前端
其他接口流程:
前端 -->请求(携带认证信息'token') --> 后端 --> 经过三大认证(在认证模块中校验出合法用户, 在经过权限和频率认证) --> 视图类 --> 数据响应给前端