mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-04 17:01:09 +00:00
Dev beta (#3048)
* [Update] 统一url地址 * [Update] 修改api * [Update] 使用规范的签名 * [Update] 修改url * [Update] 修改swagger * [Update] 添加serializer class避免报错 * [Update] 修改token * [Update] 支持api key * [Update] 支持生成api key * [Update] 修改api重定向 * [Update] 修改翻译 * [Update] 添加说明文档 * [Update] 修复浏览器关闭后session不失效的问题 * [Update] 修改一些内容 * [Update] 修改 jms脚本 * [Update] 修改重定向 * [Update] 修改搜索trim * [Update] 修改搜索trim * [Update] 添加sys log * [Bugfix] 修改登陆错误 * [Update] 优化User操作private_token的接口 (#3091) * [Update] 优化User操作private_token的接口 * [Update] 优化User操作private_token的接口 2 * [Bugfix] 解决授权了一个节点,当移动节点后,被移动的节点下的资产会放到未分组节点下的问题 * [Update] 升级jquery * [Update] 默认使用page * [Update] 修改使用Orgmodel view set * [Update] 支持 nv的硬盘 https://github.com/jumpserver/jumpserver/issues/1804 * [UPdate] 解决命令执行宽度问题 * [Update] 优化节点 * [Update] 修改nodes过多时创建比较麻烦 * [Update] 修改导入 * [Update] 节点获取更新 * [Update] 修改nodes * [Update] nodes显示full value * [Update] 统一使用nodes select2 函数 * [Update] 修改磁盘大小小数 * [Update] 修改 Node service * [Update] 优化授权节点 * [Update] 修改 node permission * [Update] 修改asset permission * [Stash] * [Update] 修改node assets api * [Update] 修改tree service,支持资产数量 * [Update] 修改暂时完成 * [Update] 修改一些bug
This commit is contained in:
@@ -12,9 +12,6 @@ from django.views.decorators.http import condition
|
||||
from django.utils.translation import ugettext as _
|
||||
from common.utils import get_logger
|
||||
from assets.utils import LabelFilterMixin
|
||||
from ..utils import (
|
||||
AssetPermissionUtil
|
||||
)
|
||||
from .. import const
|
||||
from ..hands import Asset, Node, SystemUser
|
||||
from .. import serializers
|
||||
@@ -24,119 +21,120 @@ logger = get_logger(__name__)
|
||||
__all__ = ['UserPermissionCacheMixin', 'GrantAssetsMixin', 'NodesWithUngroupMixin']
|
||||
|
||||
|
||||
def get_etag(request, *args, **kwargs):
|
||||
cache_policy = request.GET.get("cache_policy")
|
||||
if cache_policy != '1':
|
||||
return None
|
||||
if not UserPermissionCacheMixin.CACHE_ENABLE:
|
||||
return None
|
||||
view = request.parser_context.get("view")
|
||||
if not view:
|
||||
return None
|
||||
etag = view.get_meta_cache_id()
|
||||
return etag
|
||||
# def get_etag(request, *args, **kwargs):
|
||||
# cache_policy = request.GET.get("cache_policy")
|
||||
# if cache_policy != '1':
|
||||
# return None
|
||||
# if not UserPermissionCacheMixin.CACHE_ENABLE:
|
||||
# return None
|
||||
# view = request.parser_context.get("view")
|
||||
# if not view:
|
||||
# return None
|
||||
# etag = view.get_meta_cache_id()
|
||||
# return etag
|
||||
|
||||
|
||||
class UserPermissionCacheMixin:
|
||||
cache_policy = '0'
|
||||
RESP_CACHE_KEY = '_PERMISSION_RESPONSE_CACHE_V2_{}'
|
||||
CACHE_ENABLE = settings.ASSETS_PERM_CACHE_ENABLE
|
||||
CACHE_TIME = settings.ASSETS_PERM_CACHE_TIME
|
||||
_object = None
|
||||
|
||||
def get_object(self):
|
||||
return None
|
||||
|
||||
# 内部使用可控制缓存
|
||||
def _get_object(self):
|
||||
if not self._object:
|
||||
self._object = self.get_object()
|
||||
return self._object
|
||||
|
||||
def get_object_id(self):
|
||||
obj = self._get_object()
|
||||
if obj:
|
||||
return str(obj.id)
|
||||
return None
|
||||
|
||||
def get_request_md5(self):
|
||||
path = self.request.path
|
||||
query = {k: v for k, v in self.request.GET.items()}
|
||||
query.pop("_", None)
|
||||
query = "&".join(["{}={}".format(k, v) for k, v in query.items()])
|
||||
full_path = "{}?{}".format(path, query)
|
||||
return md5(full_path.encode()).hexdigest()
|
||||
|
||||
def get_meta_cache_id(self):
|
||||
obj = self._get_object()
|
||||
util = AssetPermissionUtil(obj, cache_policy=self.cache_policy)
|
||||
meta_cache_id = util.cache_meta.get('id')
|
||||
return meta_cache_id
|
||||
|
||||
def get_response_cache_id(self):
|
||||
obj_id = self.get_object_id()
|
||||
request_md5 = self.get_request_md5()
|
||||
meta_cache_id = self.get_meta_cache_id()
|
||||
resp_cache_id = '{}_{}_{}'.format(obj_id, request_md5, meta_cache_id)
|
||||
return resp_cache_id
|
||||
|
||||
def get_response_from_cache(self):
|
||||
# 没有数据缓冲
|
||||
meta_cache_id = self.get_meta_cache_id()
|
||||
if not meta_cache_id:
|
||||
logger.debug("Not get meta id: {}".format(meta_cache_id))
|
||||
return None
|
||||
# 从响应缓冲里获取响应
|
||||
key = self.get_response_key()
|
||||
data = cache.get(key)
|
||||
if not data:
|
||||
logger.debug("Not get response from cache: {}".format(key))
|
||||
return None
|
||||
logger.debug("Get user permission from cache: {}".format(self.get_object()))
|
||||
response = Response(data)
|
||||
return response
|
||||
|
||||
def expire_response_cache(self):
|
||||
obj_id = self.get_object_id()
|
||||
expire_cache_id = '{}_{}'.format(obj_id, '*')
|
||||
key = self.RESP_CACHE_KEY.format(expire_cache_id)
|
||||
cache.delete_pattern(key)
|
||||
|
||||
def get_response_key(self):
|
||||
resp_cache_id = self.get_response_cache_id()
|
||||
key = self.RESP_CACHE_KEY.format(resp_cache_id)
|
||||
return key
|
||||
|
||||
def set_response_to_cache(self, response):
|
||||
key = self.get_response_key()
|
||||
cache.set(key, response.data, self.CACHE_TIME)
|
||||
logger.debug("Set response to cache: {}".format(key))
|
||||
|
||||
@method_decorator(condition(etag_func=get_etag))
|
||||
def get(self, request, *args, **kwargs):
|
||||
if not self.CACHE_ENABLE:
|
||||
self.cache_policy = '0'
|
||||
else:
|
||||
self.cache_policy = request.GET.get('cache_policy', '0')
|
||||
|
||||
obj = self._get_object()
|
||||
if obj is None:
|
||||
logger.debug("Not get response from cache: obj is none")
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
if AssetPermissionUtil.is_not_using_cache(self.cache_policy):
|
||||
logger.debug("Not get resp from cache: {}".format(self.cache_policy))
|
||||
return super().get(request, *args, **kwargs)
|
||||
elif AssetPermissionUtil.is_refresh_cache(self.cache_policy):
|
||||
logger.debug("Not get resp from cache: {}".format(self.cache_policy))
|
||||
self.expire_response_cache()
|
||||
|
||||
logger.debug("Try get response from cache")
|
||||
resp = self.get_response_from_cache()
|
||||
if not resp:
|
||||
resp = super().get(request, *args, **kwargs)
|
||||
self.set_response_to_cache(resp)
|
||||
return resp
|
||||
pass
|
||||
# cache_policy = '0'
|
||||
# RESP_CACHE_KEY = '_PERMISSION_RESPONSE_CACHE_V2_{}'
|
||||
# CACHE_ENABLE = settings.ASSETS_PERM_CACHE_ENABLE
|
||||
# CACHE_TIME = settings.ASSETS_PERM_CACHE_TIME
|
||||
# _object = None
|
||||
#
|
||||
# def get_object(self):
|
||||
# return None
|
||||
#
|
||||
# # 内部使用可控制缓存
|
||||
# def _get_object(self):
|
||||
# if not self._object:
|
||||
# self._object = self.get_object()
|
||||
# return self._object
|
||||
#
|
||||
# def get_object_id(self):
|
||||
# obj = self._get_object()
|
||||
# if obj:
|
||||
# return str(obj.id)
|
||||
# return None
|
||||
#
|
||||
# def get_request_md5(self):
|
||||
# path = self.request.path
|
||||
# query = {k: v for k, v in self.request.GET.items()}
|
||||
# query.pop("_", None)
|
||||
# query = "&".join(["{}={}".format(k, v) for k, v in query.items()])
|
||||
# full_path = "{}?{}".format(path, query)
|
||||
# return md5(full_path.encode()).hexdigest()
|
||||
#
|
||||
# def get_meta_cache_id(self):
|
||||
# obj = self._get_object()
|
||||
# util = AssetPermissionUtil(obj, cache_policy=self.cache_policy)
|
||||
# meta_cache_id = util.cache_meta.get('id')
|
||||
# return meta_cache_id
|
||||
#
|
||||
# def get_response_cache_id(self):
|
||||
# obj_id = self.get_object_id()
|
||||
# request_md5 = self.get_request_md5()
|
||||
# meta_cache_id = self.get_meta_cache_id()
|
||||
# resp_cache_id = '{}_{}_{}'.format(obj_id, request_md5, meta_cache_id)
|
||||
# return resp_cache_id
|
||||
#
|
||||
# def get_response_from_cache(self):
|
||||
# # 没有数据缓冲
|
||||
# meta_cache_id = self.get_meta_cache_id()
|
||||
# if not meta_cache_id:
|
||||
# logger.debug("Not get meta id: {}".format(meta_cache_id))
|
||||
# return None
|
||||
# # 从响应缓冲里获取响应
|
||||
# key = self.get_response_key()
|
||||
# data = cache.get(key)
|
||||
# if not data:
|
||||
# logger.debug("Not get response from cache: {}".format(key))
|
||||
# return None
|
||||
# logger.debug("Get user permission from cache: {}".format(self.get_object()))
|
||||
# response = Response(data)
|
||||
# return response
|
||||
#
|
||||
# def expire_response_cache(self):
|
||||
# obj_id = self.get_object_id()
|
||||
# expire_cache_id = '{}_{}'.format(obj_id, '*')
|
||||
# key = self.RESP_CACHE_KEY.format(expire_cache_id)
|
||||
# cache.delete_pattern(key)
|
||||
#
|
||||
# def get_response_key(self):
|
||||
# resp_cache_id = self.get_response_cache_id()
|
||||
# key = self.RESP_CACHE_KEY.format(resp_cache_id)
|
||||
# return key
|
||||
#
|
||||
# def set_response_to_cache(self, response):
|
||||
# key = self.get_response_key()
|
||||
# cache.set(key, response.data, self.CACHE_TIME)
|
||||
# logger.debug("Set response to cache: {}".format(key))
|
||||
#
|
||||
# @method_decorator(condition(etag_func=get_etag))
|
||||
# def get(self, request, *args, **kwargs):
|
||||
# if not self.CACHE_ENABLE:
|
||||
# self.cache_policy = '0'
|
||||
# else:
|
||||
# self.cache_policy = request.GET.get('cache_policy', '0')
|
||||
#
|
||||
# obj = self._get_object()
|
||||
# if obj is None:
|
||||
# logger.debug("Not get response from cache: obj is none")
|
||||
# return super().get(request, *args, **kwargs)
|
||||
#
|
||||
# if AssetPermissionUtil.is_not_using_cache(self.cache_policy):
|
||||
# logger.debug("Not get resp from cache: {}".format(self.cache_policy))
|
||||
# return super().get(request, *args, **kwargs)
|
||||
# elif AssetPermissionUtil.is_refresh_cache(self.cache_policy):
|
||||
# logger.debug("Not get resp from cache: {}".format(self.cache_policy))
|
||||
# self.expire_response_cache()
|
||||
#
|
||||
# logger.debug("Try get response from cache")
|
||||
# resp = self.get_response_from_cache()
|
||||
# if not resp:
|
||||
# resp = super().get(request, *args, **kwargs)
|
||||
# self.set_response_to_cache(resp)
|
||||
# return resp
|
||||
|
||||
|
||||
class NodesWithUngroupMixin:
|
||||
@@ -202,9 +200,11 @@ class GrantAssetsMixin(LabelFilterMixin):
|
||||
data.append(asset)
|
||||
return data
|
||||
|
||||
def get_serializer(self, queryset_list, many=True):
|
||||
data = self.get_serializer_queryset(queryset_list)
|
||||
return super().get_serializer(data, many=True)
|
||||
def get_serializer(self, assets_items=None, many=True):
|
||||
if assets_items is None:
|
||||
assets_items = []
|
||||
assets_items = self.get_serializer_queryset(assets_items)
|
||||
return super().get_serializer(assets_items, many=many)
|
||||
|
||||
def filter_queryset_by_id(self, assets_items):
|
||||
i = self.request.query_params.get("id")
|
||||
|
Reference in New Issue
Block a user