# web领域的权限
eg:
使用账号访问某个资源 有些人可以访问(VIP) 有些人不能访问(普通用户)
ps:在web领域url其实就是权限 权限就是url
"""本质其实就是当用户登录之后 获取该用户的权限 之后每次用户发送网络请求先核对该请求地址是否在用户可以访问的url列表内 如果在则访问不在拒绝"""# 权限的设计
用户表
id name pwd
1 jason 1232 tony 3213 kevin 222
权限表
id permission
1 添加书籍
2 查看书籍
3 编辑书籍
4 删除书籍
用户与权限的关系表
id user_id permission_id
111212313"""上述的权限设计是存在缺陷的 用户数据多了之后与权限的绑定关系在第三张关系表中过于繁杂"""
RBAC
# 基于角色的权限管理
用户表
id name pwd
1 jason 1232 tony 3213 kevin 222
角色表
id role
1 CEO
2 保安
3 扫地僧
权限表
id permission url
1 添加书籍 /add/book/2 查看书籍 /check/book/3 编辑书籍 /edit/book/4 删除书籍 /delete/book/
用户角色关系表
id user_id role_id
111222
角色权限关系表
id role_id permission_id
111212313414"""
提前在角色和权限关系表中绑定好关系 之后又新用户
只有在用户和角色关系表中添加一两条数据即可!!!
"""
权限管理实战
# url权限也不是固定写死的 可能会含有正则表达式
eg:/edit/book/1//edit/book/(\d+)//edit/book/?edit_id=1/edit/book/.*1.编写登陆功能 获取用户的权限并存储
2.校验每次用户访问的url比对是否含有该权限
自定义中间件
3.有些权限是所有用户都应该具备的
白名单:里面的东西所有人都可以访问
4.有些url是含有正则的 不能简单的使用成员运算来判断
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
import re
classMyPermission(MiddlewareMixin):defprocess_request(self, request):# 定义网站白名单
white_url_list =['/login/','/register/','/admin/.*']# 1.获取当前用户请求的url
target_url = request.path
# 1.1.先校验是否在白名单中 是则直接放行for url in white_url_list:
re_path ='^%s$'% url # 将白名单里面的url变成正则表达式 去校验用户访问的url
res = re.search(re_path, target_url)if res:return# 2.获取当前用户的权限列表
permission_list = request.session.get('permission_list')# 3.判断当前请求url在不在用户可以访问的url列表中'''也需要改成正则校验的方式'''# if target_url not in permission_list:# return HttpResponse("不好意思 你没有权限访问")for permission in permission_list:
re_path ='^%s$'% permission
res = re.search(re_path, target_url)if res:returnreturn HttpResponse("你没有权限 滚蛋吧!!!")"""
扩展延伸
1.黑名单
2.用户的访问频率
获取用户的ip地址 然后设置固定的时间内访问次数不能超过多少次
...
其实上述的功能我们可以自己写 也有一些有现成的组件帮我们完成
drf相关功能
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人