feat: base 优化permission缓存处理

This commit is contained in:
caoqianming 2024-10-09 13:57:35 +08:00
parent bc77137093
commit f347630981
1 changed files with 38 additions and 26 deletions

View File

@ -5,40 +5,52 @@ from apps.system.models import DataFilter, Dept, Permission, PostRole, UserPost,
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from typing import List from typing import List
# 后端代码里有的权限标识
ALL_PERMS = [ ALL_PERMS = [
] ]
# 数据库里定义的权限标识
def get_alld_perms(update_cache=False) -> List[str]:
key = "perms_alld_list"
perms_alld_list = cache.get(key)
if perms_alld_list is None or update_cache:
nested_list = Permission.objects.all().values_list('codes', flat=True)
perms_alld_list = list(set([item for sublist in nested_list for item in sublist]))
perms_alld_list.sort()
cache.set(key, perms_alld_list, timeout=60*5)
return perms_alld_list
def get_user_perms_map(user): def get_user_perms_map(user, update_cache=False):
""" """
获取权限字典,可用redis存取(包括功能和数据权限) 获取权限字典,可用redis存取(包括功能和数据权限)
""" """
user_perms_map = {} key = f'perms_{str(user.id)}'
if user.is_superuser: if cache.get(key) is None or update_cache:
for perm in Permission.objects.all(): user_perms_map = {}
if perm.codes: if user.is_superuser:
for code in perm.codes: codes = get_alld_perms()
user_perms_map[code] = {} for code in codes:
else: user_perms_map[code] = {}
objs = UserPost.objects.filter(user=user).exclude(post=None) else:
for i in objs: objs = UserPost.objects.filter(user=user).exclude(post=None)
dept_id = str(i.dept.id) for i in objs:
for pr in PostRole.objects.filter(post=i.post): dept_id = str(i.dept.id)
""" for pr in PostRole.objects.filter(post=i.post):
岗位角色 """
""" 岗位角色
for perm in Permission.objects.filter(role_perms=pr.role): """
if perm.codes: for perm in Permission.objects.filter(role_perms=pr.role):
for code in perm.codes: if perm.codes:
if code in user_perms_map: for code in perm.codes:
data_range = user_perms_map[code].get( if code in user_perms_map:
dept_id, -1) data_range = user_perms_map[code].get(
if pr.data_range < data_range: dept_id, -1)
user_perms_map[code][dept_id] = pr.data_range if pr.data_range < data_range:
else: user_perms_map[code][dept_id] = pr.data_range
user_perms_map[code] = {dept_id: pr.data_range} else:
cache.set('perms_' + str(user.id), user_perms_map, timeout=300) user_perms_map[code] = {dept_id: pr.data_range}
cache.set(key, user_perms_map, timeout=300)
return user_perms_map return user_perms_map