You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.9 KiB

import json
from django_redis import get_redis_connection
from erp_system.models import PermissionsModel
def cache_permissions_by_user(user):
"""
把当前用户的权限信息缓存到Redis数据库中
Redis 中存放用户权限的结构为 user_用户ID---> 字典{key:path, value[列表] }
"""
permission_ids = user.roles.values_list('permissions', flat=True).distinct()
# permission_list 返回是列表和字典的嵌套,如下:[{'id':1, 'path': '/xxx/xxx'}, {'id':2, 'path': '/xxx/aaa'}]
permission_list = PermissionsModel.objects.filter(id__in=permission_ids, is_menu=False).values('id', 'path', 'method', 'name')
if not permission_list.exists():
# 该用户根本就没有分配权限, 直接返回
return None
permission_dict = {} # 存放权限的字典
for permission in permission_list: # permission是字典
# 去除不可见字符, \u200b是Unicode中的零宽度字符可以理解为不可见字符。
method = str(permission.get('method')).replace('\u200b', '')
path = str(permission.get('path')).replace('\u200b', '')
_name = str(permission.get('name')).replace('\u200b', '')
_id = permission.get('id')
if permission_dict.get(path):
# 如果字典中已经存在一个相同path的权限把新权限追加
permission_dict[path].append({
'method': method,
'sign': _name,
'id': _id
})
else:
permission_dict[path] = [{
'method': method,
'sign': _name,
'id': _id
}]
# 因为redis中的值只能存放字节 由字符串转换字节 。 json格式的字符串
for key in permission_dict:
permission_dict[key] = json.dumps(permission_dict[key])
redis_conn = get_redis_connection('default')
redis_conn.hmset(f'user_{user.id}', permission_dict)