fix: 修复 perms 循环引用

pull/9461/head
ibuler 2023-02-08 10:30:06 +08:00 committed by 老广
parent 63a4620b19
commit 8c65429157
1 changed files with 23 additions and 8 deletions

View File

@ -331,6 +331,7 @@ class RoleMixin:
_org_roles = None _org_roles = None
_system_roles = None _system_roles = None
PERM_CACHE_KEY = 'USER_PERMS_ROLES_{}_{}' PERM_CACHE_KEY = 'USER_PERMS_ROLES_{}_{}'
PERM_ORG_KEY = 'USER_PERMS_ORG_{}'
_is_superuser = None _is_superuser = None
_update_superuser = False _update_superuser = False
@ -348,29 +349,39 @@ class RoleMixin:
@lazyproperty @lazyproperty
def console_orgs(self): def console_orgs(self):
return self.cached_role_and_perms['console_orgs'] return self.cached_orgs['console_orgs']
@lazyproperty @lazyproperty
def audit_orgs(self): def audit_orgs(self):
return self.cached_role_and_perms['audit_orgs'] return self.cached_orgs['audit_orgs']
@lazyproperty @lazyproperty
def workbench_orgs(self): def workbench_orgs(self):
return self.cached_role_and_perms['workbench_orgs'] return self.cached_orgs['workbench_orgs']
@lazyproperty
def cached_orgs(self):
from rbac.models import RoleBinding
key = self.PERM_ORG_KEY.format(self.id)
data = cache.get(key)
if data:
return data
data = {
'console_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_console', self),
'audit_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_audit', self),
'workbench_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_workbench', self),
}
cache.set(key, data, 60 * 60)
return data
@lazyproperty @lazyproperty
def cached_role_and_perms(self): def cached_role_and_perms(self):
from rbac.models import RoleBinding
key = self.PERM_CACHE_KEY.format(self.id, current_org.id) key = self.PERM_CACHE_KEY.format(self.id, current_org.id)
data = cache.get(key) data = cache.get(key)
if data: if data:
return data return data
data = { data = {
'console_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_console', self),
'audit_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_audit', self),
'workbench_orgs': RoleBinding.get_user_has_the_perm_orgs('rbac.view_workbench', self),
'org_roles': self.org_roles.all(), 'org_roles': self.org_roles.all(),
'system_roles': self.system_roles.all(), 'system_roles': self.system_roles.all(),
'perms': self.get_all_permissions(), 'perms': self.get_all_permissions(),
@ -381,11 +392,15 @@ class RoleMixin:
def expire_rbac_perms_cache(self): def expire_rbac_perms_cache(self):
key = self.PERM_CACHE_KEY.format(self.id, '*') key = self.PERM_CACHE_KEY.format(self.id, '*')
cache.delete_pattern(key) cache.delete_pattern(key)
key = self.PERM_ORG_KEY.format(self.id)
cache.delete(key)
@classmethod @classmethod
def expire_users_rbac_perms_cache(cls): def expire_users_rbac_perms_cache(cls):
key = cls.PERM_CACHE_KEY.format('*', '*') key = cls.PERM_CACHE_KEY.format('*', '*')
cache.delete_pattern(key) cache.delete_pattern(key)
key = cls.PERM_ORG_KEY.format('*')
cache.delete_pattern(key)
@lazyproperty @lazyproperty
def perms(self): def perms(self):