feat:(REQ-2300) 把数据权限的注解分两个,一个预制数据,一个使用数据,方便拦截器做定制拦截

This commit is contained in:
lilong 2024-06-13 16:25:21 +08:00
parent 0198b16874
commit f82f85f8fe
14 changed files with 196 additions and 129 deletions

View File

@ -1,7 +1,7 @@
package cn.axzo.framework.datapermission.advice;
import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.annotation.DataPermissionPrepare;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import cn.axzo.framework.datapermission.util.DPUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@ -39,12 +39,12 @@ public class DataPermissionResponseBodyAdvice implements ResponseBodyAdvice<Obje
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
DataPermission dataPermission = returnType.getDeclaringClass().getAnnotation(DataPermission.class);
if (dataPermission != null) {
return dataPermission.enable();
DataPermissionPrepare dataPermissionPrepare = returnType.getDeclaringClass().getAnnotation(DataPermissionPrepare.class);
if (dataPermissionPrepare != null) {
return dataPermissionPrepare.enable();
} else {
dataPermission = returnType.getMethodAnnotation(DataPermission.class);
return dataPermission != null && dataPermission.enable();
dataPermissionPrepare = returnType.getMethodAnnotation(DataPermissionPrepare.class);
return dataPermissionPrepare != null && dataPermissionPrepare.enable();
}
}
@ -64,7 +64,7 @@ public class DataPermissionResponseBodyAdvice implements ResponseBodyAdvice<Obje
log.warn("api result is not object or array");
return body;
}
DataPermissionContextHolder.DataPermissionContext context = DataPermissionContextHolder.get();
DataPermissionPrepareContextHolder.DataPermissionPrepareContext context = DataPermissionPrepareContextHolder.get();
if (Objects.isNull(context) || Objects.isNull(context.getPersonId())) {
log.warn("threadLocal hos not DataPermissionContext or no personId");
return body;
@ -76,7 +76,7 @@ public class DataPermissionResponseBodyAdvice implements ResponseBodyAdvice<Obje
}
// 最终清除ThreadLocal的内容
DataPermissionContextHolder.remove();
DataPermissionPrepareContextHolder.remove();
return body;
}

View File

@ -1,7 +1,7 @@
package cn.axzo.framework.datapermission.advice;
import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.annotation.DataPermissionPrepare;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import cn.axzo.framework.datapermission.util.RpcInternalUtil;
import cn.axzo.karma.client.feign.tyr.DataObjectApi;
import cn.axzo.karma.client.feign.tyr.request.ExamineDpColumnsReq;
@ -40,10 +40,10 @@ public class DataPermissionResponseExecutor {
}
public void processNode(DataPermissionContextHolder.DataPermissionContext context, JsonNode dataNode) {
DataPermission dataPermission = context.getDataPermission();
public void processNode(DataPermissionPrepareContextHolder.DataPermissionPrepareContext context, JsonNode dataNode) {
DataPermissionPrepare dataPermissionPrepare = context.getDataPermissionPrepare();
List<ExamineDpColumnsReq.OrgNodeIdAndPersonId> orgNodeIdAndPersonIds = Lists.newArrayList();
recursiveGetOrgNodeIdAndPersonIds(dataPermission, dataNode, orgNodeIdAndPersonIds);
recursiveGetOrgNodeIdAndPersonIds(dataPermissionPrepare, dataNode, orgNodeIdAndPersonIds);
if (CollectionUtils.isEmpty(orgNodeIdAndPersonIds)) {
log.warn("api result has no organizationalNodeId and personId, not examine data permission for result columns.");
return;
@ -60,13 +60,13 @@ public class DataPermissionResponseExecutor {
return;
}
// 根据karma数据列的校验结果处理api结果的数据对象
recursiveGetOrgNodeIdAndPersonIds(dataPermission, dataNode, examineDpColumnsResp.getAttributeDpResultMap());
recursiveGetOrgNodeIdAndPersonIds(dataPermissionPrepare, dataNode, examineDpColumnsResp.getAttributeDpResultMap());
}
private void recursiveGetOrgNodeIdAndPersonIds(DataPermission dataPermission, JsonNode dataNode, List<ExamineDpColumnsReq.OrgNodeIdAndPersonId> orgNodeIdAndPersonIds) {
private void recursiveGetOrgNodeIdAndPersonIds(DataPermissionPrepare dataPermissionPrepare, JsonNode dataNode, List<ExamineDpColumnsReq.OrgNodeIdAndPersonId> orgNodeIdAndPersonIds) {
if (dataNode.isObject()) {
Long resultOrganizationalNodeId = Objects.nonNull(dataNode.get(dataPermission.key_organizationalNodeId())) ? dataNode.get(dataPermission.key_organizationalNodeId()).asLong() : 0L;
Long resultPersonId = Objects.nonNull(dataNode.get(dataPermission.key_personId())) ? dataNode.get(dataPermission.key_personId()).asLong() : 0L;
Long resultOrganizationalNodeId = Objects.nonNull(dataNode.get(dataPermissionPrepare.key_organizationalNodeId())) ? dataNode.get(dataPermissionPrepare.key_organizationalNodeId()).asLong() : 0L;
Long resultPersonId = Objects.nonNull(dataNode.get(dataPermissionPrepare.key_personId())) ? dataNode.get(dataPermissionPrepare.key_personId()).asLong() : 0L;
if (resultOrganizationalNodeId.equals(0L) && resultPersonId.equals(0L)) {
return;
}
@ -77,16 +77,16 @@ public class DataPermissionResponseExecutor {
Iterator<JsonNode> elements = arrayNode.elements();
while (elements.hasNext()) {
JsonNode element = elements.next();
recursiveGetOrgNodeIdAndPersonIds(dataPermission, element, orgNodeIdAndPersonIds);
recursiveGetOrgNodeIdAndPersonIds(dataPermissionPrepare, element, orgNodeIdAndPersonIds);
}
}
}
private void recursiveGetOrgNodeIdAndPersonIds(DataPermission dataPermission, JsonNode dataNode,
private void recursiveGetOrgNodeIdAndPersonIds(DataPermissionPrepare dataPermissionPrepare, JsonNode dataNode,
Map<String, Map<String, ExamineDpColumnsResp.AttributePermissionBasicDTO>> attributeDpResultMap) {
if (dataNode.isObject()) {
Long resultOrganizationalNodeId = Objects.nonNull(dataNode.get(dataPermission.key_organizationalNodeId())) ? dataNode.get(dataPermission.key_organizationalNodeId()).asLong() : 0L;
Long resultPersonId = Objects.nonNull(dataNode.get(dataPermission.key_personId())) ? dataNode.get(dataPermission.key_personId()).asLong() : 0L;
Long resultOrganizationalNodeId = Objects.nonNull(dataNode.get(dataPermissionPrepare.key_organizationalNodeId())) ? dataNode.get(dataPermissionPrepare.key_organizationalNodeId()).asLong() : 0L;
Long resultPersonId = Objects.nonNull(dataNode.get(dataPermissionPrepare.key_personId())) ? dataNode.get(dataPermissionPrepare.key_personId()).asLong() : 0L;
if (resultOrganizationalNodeId.equals(0L) && resultPersonId.equals(0L)) {
return;
}
@ -116,7 +116,7 @@ public class DataPermissionResponseExecutor {
Iterator<JsonNode> elements = arrayNode.elements();
while (elements.hasNext()) {
JsonNode element = elements.next();
recursiveGetOrgNodeIdAndPersonIds(dataPermission, element, attributeDpResultMap);
recursiveGetOrgNodeIdAndPersonIds(dataPermissionPrepare, element, attributeDpResultMap);
}
}
}

View File

@ -1,20 +1,24 @@
package cn.axzo.framework.datapermission.annotation;
import cn.axzo.framework.datapermission.rule.OrgDefaultRule;
import cn.axzo.framework.datapermission.rule.DataPermissionRule;
import cn.axzo.framework.datapermission.rule.DataPermissionRuleService;
import cn.axzo.framework.datapermission.rule.OrgDefaultRuleServiceImpl;
import java.lang.annotation.*;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 数据权限注解
* @author tanjie@axzo.cn
* @date 2024/5/30 17:57
*/
@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataPermission {
boolean enable() default true;
/**
@ -22,23 +26,6 @@ public @interface DataPermission {
* 只有在提供sql查询的服务才会生效使用
* @return
*/
Class<? extends DataPermissionRule> includeRule() default OrgDefaultRule.class;
/**
* 数据权限数据对象code
* @return
*/
String bizCode() default "";
/**
* ApiResult返回的机构节点的ID
* @return
*/
String key_organizationalNodeId() default "organizationalNodeId";
/**
* ApiResult返回的用户的ID
* @return
*/
String key_personId() default "personId";
Class<? extends DataPermissionRuleService> includeRule() default OrgDefaultRuleServiceImpl.class;
}

View File

@ -0,0 +1,34 @@
package cn.axzo.framework.datapermission.annotation;
import java.lang.annotation.*;
/**
* 数据权限数据预制注解
* @author tanjie@axzo.cn
* @date 2024/5/30 17:57
*/
@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface DataPermissionPrepare {
boolean enable() default true;
/**
* 数据权限数据对象code
* @return
*/
String bizCode() default "";
/**
* ApiResult返回的机构节点的ID
* @return
*/
String key_organizationalNodeId() default "organizationalNodeId";
/**
* ApiResult返回的用户的ID
* @return
*/
String key_personId() default "personId";
}

View File

@ -1,6 +1,7 @@
package cn.axzo.framework.datapermission.aop;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import com.alibaba.fastjson.JSONObject;
import feign.RequestInterceptor;
import feign.RequestTemplate;
@ -17,11 +18,15 @@ public class DataPermissionFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.get();
if (dataPermissionContext == null) {
DataPermissionPrepareContextHolder.DataPermissionPrepareContext dataPermissionPrepareContext = DataPermissionPrepareContextHolder.get();
if (dataPermissionPrepareContext == null) {
return;
}
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.DataPermissionContext.builder()
.dataPermissionNodeIds(dataPermissionPrepareContext.getDataPermissionNodeIds())
.dataPermissionPersonIds(dataPermissionPrepareContext.getDataPermissionPersonIds())
.build();
requestTemplate.header(DATA_PERMISSION_HEADER, JSONObject.toJSONString(dataPermissionContext));
}
}

View File

@ -4,7 +4,6 @@ import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
@ -24,7 +23,7 @@ import static cn.axzo.framework.datapermission.context.DataPermissionContextHold
*/
@Component
@Slf4j
public class DataPermissionFilter implements HandlerInterceptor, WebMvcConfigurer {
public class DataPermissionInterceptor implements HandlerInterceptor, WebMvcConfigurer {
/**
* 拦截@DataPermission
@ -40,12 +39,6 @@ public class DataPermissionFilter implements HandlerInterceptor, WebMvcConfigure
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
DataPermission dataPermission = handlerMethod.getMethodAnnotation(DataPermission.class);
if (dataPermission == null || BooleanUtils.isNotTrue(dataPermission.enable())) {
return true;
}
String dataPermissionHeader = request.getHeader(DATA_PERMISSION_HEADER);
if (StringUtils.isBlank(dataPermissionHeader)) {
@ -54,6 +47,10 @@ public class DataPermissionFilter implements HandlerInterceptor, WebMvcConfigure
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = JSONObject.parseObject(dataPermissionHeader, DataPermissionContextHolder.DataPermissionContext.class);
HandlerMethod handlerMethod = (HandlerMethod) handler;
DataPermission dataPermission = handlerMethod.getMethodAnnotation(DataPermission.class);
dataPermissionContext.setDataPermission(dataPermission);
DataPermissionContextHolder.setContext(dataPermissionContext);
}
return true;

View File

@ -1,11 +1,11 @@
package cn.axzo.framework.datapermission.aop;
import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.annotation.DataPermissionPrepare;
import cn.axzo.framework.datapermission.context.DataPermissionContextFactory;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.rule.DataPermissionRule;
import cn.axzo.karma.client.feign.tyr.response.MatchDataObjectResp;
import com.alibaba.fastjson.JSONObject;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import cn.axzo.framework.datapermission.rule.DataPermissionRuleService;
import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
@ -139,15 +139,15 @@ public class DataPermissionMybatisInterceptor extends JsqlParserSupport implemen
protected Expression andExpression(Table table, Expression where) {
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.get();
DataPermission dataPermission = dataPermissionContext.getDataPermission();
List<DataPermissionRule> byDataPermission = dataPermissionContextFactory.getRuleByDataPermission(dataPermission);
Optional<DataPermissionRule> first = byDataPermission.stream().filter(rule -> rule.getTableName().contains(table.getName())).findFirst();
DataPermissionPrepareContextHolder.DataPermissionPrepareContext dataPermissionPrepareContext = DataPermissionPrepareContextHolder.get();
DataPermissionPrepare dataPermissionPrepare = dataPermissionPrepareContext.getDataPermissionPrepare();
List<DataPermissionRuleService> byDataPermission = dataPermissionContextFactory.getRuleByDataPermission(dataPermissionPrepare);
Optional<DataPermissionRuleService> first = byDataPermission.stream().filter(rule -> rule.getTableName().contains(table.getName())).findFirst();
if (!first.isPresent()) {
return where;
}
DataPermissionRule dataPermissionRule = first.get();
Expression ruleExpression = dataPermissionRule.getExpression(table.getName(), table.getAlias());
DataPermissionRuleService dataPermissionRuleService = first.get();
Expression ruleExpression = dataPermissionRuleService.getExpression(table.getName(), table.getAlias());
if (null != where) {
if (where instanceof OrExpression) {
@ -296,13 +296,13 @@ public class DataPermissionMybatisInterceptor extends JsqlParserSupport implemen
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.get();
DataPermission dataPermission = dataPermissionContext.getDataPermission();
List<DataPermissionRule> byDataPermission = dataPermissionContextFactory.getRuleByDataPermission(dataPermission);
Optional<DataPermissionRule> first = byDataPermission.stream().filter(rule -> rule.getTableName().contains(table.getName())).findFirst();
List<DataPermissionRuleService> byDataPermission = dataPermissionContextFactory.getRuleByDataPermission(dataPermission);
Optional<DataPermissionRuleService> first = byDataPermission.stream().filter(rule -> rule.getTableName().contains(table.getName())).findFirst();
if (!first.isPresent()) {
return currentExpression;
}
DataPermissionRule dataPermissionRule = first.get();
Expression ruleExpression = dataPermissionRule.getExpression(table.getName(), table.getAlias());
DataPermissionRuleService dataPermissionRuleService = first.get();
Expression ruleExpression = dataPermissionRuleService.getExpression(table.getName(), table.getAlias());
if (currentExpression == null) {
return ruleExpression;
}
@ -313,14 +313,11 @@ public class DataPermissionMybatisInterceptor extends JsqlParserSupport implemen
}
}
private boolean filter() {
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.get();
if (null == dataPermissionContext
|| dataPermissionContext.getDataPermission() == null
|| !dataPermissionContext.getDataPermission().enable()) {
DataPermissionPrepareContextHolder.DataPermissionPrepareContext dataPermissionPrepareContext = DataPermissionPrepareContextHolder.get();
if (null == dataPermissionPrepareContext
|| dataPermissionPrepareContext.getDataPermissionPrepare() == null
|| !dataPermissionPrepareContext.getDataPermissionPrepare().enable()) {
return false;
}

View File

@ -2,13 +2,14 @@ package cn.axzo.framework.datapermission.aop;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.annotation.DataPermissionPrepare;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import cn.axzo.karma.client.feign.tyr.DataObjectApi;
import cn.axzo.karma.client.feign.tyr.request.MatchDataObjectReq;
import cn.axzo.karma.client.feign.tyr.response.MatchDataObjectResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
@ -25,7 +26,7 @@ import java.util.Optional;
*/
@Component
@Slf4j
public class ResolveDataPermissionRuleFilter implements HandlerInterceptor, WebMvcConfigurer {
public class DataPermissionPrepareInterceptor implements HandlerInterceptor, WebMvcConfigurer {
@Autowired
private DataObjectApi dataObjectApi;
@ -45,8 +46,8 @@ public class ResolveDataPermissionRuleFilter implements HandlerInterceptor, WebM
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
DataPermission dataPermission = handlerMethod.getMethodAnnotation(DataPermission.class);
if (dataPermission == null || BooleanUtils.isNotTrue(dataPermission.enable())) {
DataPermissionPrepare dataPermissionPrepare = handlerMethod.getMethodAnnotation(DataPermissionPrepare.class);
if (dataPermissionPrepare == null || BooleanUtils.isNotTrue(dataPermissionPrepare.enable()) || StringUtils.isBlank(dataPermissionPrepare.bizCode())) {
return true;
}
@ -55,18 +56,18 @@ public class ResolveDataPermissionRuleFilter implements HandlerInterceptor, WebM
return true;
}
Optional<MatchDataObjectResp> matchDataObjectOptional = this.matchRule(dataPermission);
Optional<MatchDataObjectResp> matchDataObjectOptional = this.matchRule(dataPermissionPrepare);
if (!matchDataObjectOptional.isPresent()) {
log.warn("no match data rule, bizCode:{}, personId{}, ouId:{}, workspaceId:{}",
dataPermission.bizCode(),
dataPermissionPrepare.bizCode(),
contextInfo.getUserInfo().getPersonId(),
contextInfo.getOuId(),
contextInfo.getWorkspaceId());
return true;
}
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.DataPermissionContext.builder()
.dataPermission(dataPermission)
DataPermissionPrepareContextHolder.DataPermissionPrepareContext dataPermissionPrepareContext = DataPermissionPrepareContextHolder.DataPermissionPrepareContext.builder()
.dataPermissionPrepare(dataPermissionPrepare)
.workspaceId(contextInfo.getWorkspaceId())
.ouId(contextInfo.getOuId())
.personId(contextInfo.getUserInfo().getPersonId())
@ -75,17 +76,17 @@ public class ResolveDataPermissionRuleFilter implements HandlerInterceptor, WebM
.resultKey(matchDataObjectOptional.get().getResultKey())
.build();
DataPermissionContextHolder.setContext(dataPermissionContext);
DataPermissionPrepareContextHolder.setContext(dataPermissionPrepareContext);
}
return true;
}
private Optional<MatchDataObjectResp> matchRule(DataPermission dataPermission) {
private Optional<MatchDataObjectResp> matchRule(DataPermissionPrepare dataPermissionPrepare) {
ContextInfo contextInfo = ContextInfoHolder.get();
MatchDataObjectReq matchDataObjectReq = MatchDataObjectReq.builder()
.dataObjectCode(dataPermission.bizCode())
.dataObjectCode(dataPermissionPrepare.bizCode())
.ouId(contextInfo.getOuId())
.workspaceId(contextInfo.getWorkspaceId())
.personId(contextInfo.getUserInfo().getPersonId())

View File

@ -2,7 +2,7 @@ package cn.axzo.framework.datapermission.config;
import cn.axzo.framework.datapermission.aop.DataPermissionMybatisInterceptor;
import cn.axzo.framework.datapermission.context.DataPermissionContextFactory;
import cn.axzo.framework.datapermission.rule.DataPermissionRule;
import cn.axzo.framework.datapermission.rule.DataPermissionRuleService;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
@ -26,7 +26,7 @@ public class DataPermissionConfig {
@Bean
public DataPermissionContextFactory dataPermissionRuleFactory(List<DataPermissionRule> rules) {
public DataPermissionContextFactory dataPermissionRuleFactory(List<DataPermissionRuleService> rules) {
return new DataPermissionContextFactory(rules);
}
}

View File

@ -1,7 +1,7 @@
package cn.axzo.framework.datapermission.context;
import cn.axzo.framework.datapermission.annotation.DataPermission;
import cn.axzo.framework.datapermission.rule.DataPermissionRule;
import cn.axzo.framework.datapermission.rule.DataPermissionRuleService;
import lombok.AllArgsConstructor;
import java.util.List;
@ -15,15 +15,15 @@ import java.util.stream.Collectors;
@AllArgsConstructor
public class DataPermissionContextFactory {
List<DataPermissionRule> rules;
List<DataPermissionRuleService> rules;
public List<DataPermissionRule> getRules() {
public List<DataPermissionRuleService> getRules() {
return rules;
}
public List<DataPermissionRule> getRuleByDataPermission(DataPermission dataPermission) {
Class<? extends DataPermissionRule> classes = dataPermission.includeRule();
public List<DataPermissionRuleService> getRuleByDataPermission(DataPermission dataPermission) {
Class<? extends DataPermissionRuleService> classes = dataPermission.includeRule();
return rules.stream().filter(rule -> Objects.equals(classes, rule.getClass())).collect(Collectors.toList());
}

View File

@ -8,12 +8,6 @@ import lombok.NoArgsConstructor;
import java.util.Set;
/**
* 数据权限上下文
*
* @author tanjie@axzo.cn
* @date 2024/5/31 11:42
*/
public class DataPermissionContextHolder {
public static final String DATA_PERMISSION_HEADER = "dataPermission";
@ -32,21 +26,6 @@ public class DataPermissionContextHolder {
public static class DataPermissionContext {
private DataPermission dataPermission;
/**
* 当前单位id
*/
private Long ouId;
/**
* 当前项目id
*/
private Long workspaceId;
/**
* 登录人
*/
private Long personId;
/**
* 解析后的人员id
*/
@ -56,11 +35,6 @@ public class DataPermissionContextHolder {
* 解析后的部门id
*/
private Set<Long> dataPermissionNodeIds;
/**
* 匹配的解析规则放在redis中的key
*/
private String resultKey;
}
public static void remove() {
@ -71,4 +45,3 @@ public class DataPermissionContextHolder {
return DATA_PERMISSION_CONTEXT.get();
}
}

View File

@ -0,0 +1,73 @@
package cn.axzo.framework.datapermission.context;
import cn.axzo.framework.datapermission.annotation.DataPermissionPrepare;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Set;
/**
* 数据权限上下文
*
* @author tanjie@axzo.cn
* @date 2024/5/31 11:42
*/
public class DataPermissionPrepareContextHolder {
private final static ThreadLocal<DataPermissionPrepareContext> DATA_PERMISSION_CONTEXT = new ThreadLocal<>();
public static void setContext(DataPermissionPrepareContext dataPermission) {
DATA_PERMISSION_CONTEXT.set(dataPermission);
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class DataPermissionPrepareContext {
private DataPermissionPrepare dataPermissionPrepare;
/**
* 当前单位id
*/
private Long ouId;
/**
* 当前项目id
*/
private Long workspaceId;
/**
* 登录人
*/
private Long personId;
/**
* 解析后的人员id
*/
private Set<Long> dataPermissionPersonIds;
/**
* 解析后的部门id
*/
private Set<Long> dataPermissionNodeIds;
/**
* 匹配的解析规则放在redis中的key
*/
private String resultKey;
}
public static void remove() {
DATA_PERMISSION_CONTEXT.remove();
}
public static DataPermissionPrepareContext get() {
return DATA_PERMISSION_CONTEXT.get();
}
}

View File

@ -9,7 +9,7 @@ import java.util.Set;
* @author tanjie@axzo.cn
* @date 2024/5/30 18:31
*/
public interface DataPermissionRule {
public interface DataPermissionRuleService {
Set<String> getTableName();

View File

@ -1,6 +1,6 @@
package cn.axzo.framework.datapermission.rule;
import cn.axzo.framework.datapermission.context.DataPermissionContextHolder;
import cn.axzo.framework.datapermission.context.DataPermissionPrepareContextHolder;
import cn.axzo.karma.client.feign.tyr.DataObjectApi;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
@ -35,7 +35,7 @@ import java.util.stream.Collectors;
@Builder
@RequiredArgsConstructor
@Slf4j
public class OrgDefaultRule implements DataPermissionRule {
public class OrgDefaultRuleServiceImpl implements DataPermissionRuleService {
static final Expression EXPRESSION_NULL = new NullValue();
private static final String DEFAULT_PERSON = "person_id";
@ -64,15 +64,15 @@ public class OrgDefaultRule implements DataPermissionRule {
@Override
public Expression getExpression(String tableName, Alias tableAlias) {
DataPermissionContextHolder.DataPermissionContext dataPermissionContext = DataPermissionContextHolder.get();
DataPermissionPrepareContextHolder.DataPermissionPrepareContext dataPermissionPrepareContext = DataPermissionPrepareContextHolder.get();
if (dataPermissionContext == null) {
if (dataPermissionPrepareContext == null) {
log.warn("not found dataPermissionContext");
return EXPRESSION_NULL;
}
Set<Long> nodeIds = dataPermissionContext.getDataPermissionNodeIds();
Set<Long> personIds = dataPermissionContext.getDataPermissionPersonIds();
Set<Long> nodeIds = dataPermissionPrepareContext.getDataPermissionNodeIds();
Set<Long> personIds = dataPermissionPrepareContext.getDataPermissionPersonIds();
Expression deptExpression = buildExpression(tableName, tableAlias, nodeIds);
Expression userExpression = buildExpression(tableName, tableAlias, personIds);