RBAC (Role-Based Access Control)
用于公司内部:CRM客户关系管理
原理:权限与角色相关联,角色看作是一个组(公司分部门)
权限、角色、用户。(赋予用户角色)
django的auth组件(app)实现RBAC。
--auth_user 用户表:用户信息
--auth_groups 组表,部门表(角色)
--auth_permisson 权限表:发工资的权限,招人的权限...
--auth_group_permissons 部门和权限是多对多,中间表
--auth_user_groups 用户和部门是多对多,中间表
--auth_user_user_permissions 用户和权限是多不多,中间表
simple-ui
1、安装django-simpleui
2、在应用里注册
INSTALLED_APPS = [
'simpleui',
]
3、再重新进入admin后台管理它就变了
JWT (Json Web Token) 就是token,一种前后端的认证方式。认证是否是这个用户。
token由三段构成。后端不存token,存加密方式和密钥。
eyJ0eXAiOiJXXXXXXX.eyJzdWIiOjXXXXXXX.TJVA95OrMcBXXXXXXXX
header头部:认证方式jwt,公司名字... {"typ":"JWT","alg":"HS256"}
payload荷载:auth_user表里的用户信息,签发时间... {"user_id":1,"username":"andy","exp":1626505593,"email":""}
signature签名:头部与荷载拼接加密后的串。
1、签发:登录成功后把token返回给客户端,下次发送请求时带过来。
2、校验:把header和payload用相同的加密方式再算一般,得到的串和发来的串一致就校验成功。
str转bytes用encode('utf-8')
s = 'hello'
b = s.encode('utf-8')
bb = bytes(b,encoding='utf-8') # 这个也可以,调用类实列化对象。
bytes转str用decode('utf-8')
b = b'world'
s = b.decode('utf-8')
ss = str(b,encoding='utf-8') # 调用类实列化对象。
base64编码
base64的长度是固定的,必须是4的整数倍,不够用=补。
编码和解码得是bytes类型。
user_info = {'name':'lqz'}
user_info_str = json.dumps(user_info) # 字典序列化成json格式的str
b64 = base64.b64encode(bytes(user_info_str,encoding='utf-8')) # str转成bytes后编码
print(b64) # b'eyJuYW1lIjogImxxeiJ9' 编码后的串
base64解码
bb64 = base64.b64decode('eyJuYW1lIjogImxxeiJ9'.encode('utf-8')) # 把串转成bytes类型后解码
print(bb64) # 解码后的数据 b'{"name": "lqz"}'
jwt快速签发token
1、安装djangorestframework-jwt # 这个很久没维护了
djangorestframework-simplejwt # 这个和上面的基本一样。
2、在路由中配置,向这个地址发送post请求,携带用户名密码,就能签发token。(内部使用的是auth_user表)
from rest_framework_jwt.views import obtain_jwt_token
path('login/',obtain_jwt_token),
jwt的认证类得配合权限一起使用。
在视图类中配置认证类,权限类
JSONWebTokenAuthentication的父类重写了authenticate方法。
请求头的key是Authorization, value是jwt+空格+token
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
authentication_classes = [JSONWebTokenAuthentication,] # 认证类
permission_classes = [IsAuthenticated] # 权限类,配置后如果不带token就无法访问。
浙公网安备 33010602011771号