mirror of
https://github.com/continew-org/continew-starter.git
synced 2025-09-15 04:57:42 +08:00
refactor(extension/datapermission): UserContext、RoleContext 重命名为 UserData、RoleData,以避免和应用冲突
This commit is contained in:
@@ -16,15 +16,15 @@
|
|||||||
|
|
||||||
package top.continew.starter.extension.datapermission.filter;
|
package top.continew.starter.extension.datapermission.filter;
|
||||||
|
|
||||||
import top.continew.starter.extension.datapermission.model.UserContext;
|
import top.continew.starter.extension.datapermission.model.UserData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据权限用户上下文提供者
|
* 数据权限用户数据提供者
|
||||||
*
|
*
|
||||||
* @author Charles7c
|
* @author Charles7c
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public interface DataPermissionUserContextProvider {
|
public interface DataPermissionUserDataProvider {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否过滤
|
* 是否过滤
|
||||||
@@ -34,9 +34,9 @@ public interface DataPermissionUserContextProvider {
|
|||||||
boolean isFilter();
|
boolean isFilter();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户上下文
|
* 获取用户数据
|
||||||
*
|
*
|
||||||
* @return 用户上下文
|
* @return 用户数据
|
||||||
*/
|
*/
|
||||||
UserContext getUserContext();
|
UserData getUserData();
|
||||||
}
|
}
|
@@ -19,12 +19,12 @@ package top.continew.starter.extension.datapermission.model;
|
|||||||
import top.continew.starter.extension.datapermission.enums.DataScope;
|
import top.continew.starter.extension.datapermission.enums.DataScope;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色上下文
|
* 角色数据
|
||||||
*
|
*
|
||||||
* @author Charles7c
|
* @author Charles7c
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public class RoleContext {
|
public class RoleData {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色 ID
|
* 角色 ID
|
||||||
@@ -36,10 +36,10 @@ public class RoleContext {
|
|||||||
*/
|
*/
|
||||||
private DataScope dataScope;
|
private DataScope dataScope;
|
||||||
|
|
||||||
public RoleContext() {
|
public RoleData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public RoleContext(String roleId, DataScope dataScope) {
|
public RoleData(String roleId, DataScope dataScope) {
|
||||||
this.roleId = roleId;
|
this.roleId = roleId;
|
||||||
this.dataScope = dataScope;
|
this.dataScope = dataScope;
|
||||||
}
|
}
|
||||||
@@ -59,4 +59,20 @@ public class RoleContext {
|
|||||||
public void setDataScope(DataScope dataScope) {
|
public void setDataScope(DataScope dataScope) {
|
||||||
this.dataScope = dataScope;
|
this.dataScope = dataScope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
RoleData roleData = (RoleData)o;
|
||||||
|
return roleId.equals(roleData.roleId) && dataScope == roleData.dataScope;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int result = roleId.hashCode();
|
||||||
|
result = 31 * result + dataScope.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
@@ -19,12 +19,12 @@ package top.continew.starter.extension.datapermission.model;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户上下文
|
* 用户数据
|
||||||
*
|
*
|
||||||
* @author Charles7c
|
* @author Charles7c
|
||||||
* @since 1.1.0
|
* @since 1.1.0
|
||||||
*/
|
*/
|
||||||
public class UserContext {
|
public class UserData {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户 ID
|
* 用户 ID
|
||||||
@@ -34,7 +34,7 @@ public class UserContext {
|
|||||||
/**
|
/**
|
||||||
* 角色列表
|
* 角色列表
|
||||||
*/
|
*/
|
||||||
private Set<RoleContext> roles;
|
private Set<RoleData> roles;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 部门 ID
|
* 部门 ID
|
||||||
@@ -49,11 +49,11 @@ public class UserContext {
|
|||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<RoleContext> getRoles() {
|
public Set<RoleData> getRoles() {
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRoles(Set<RoleContext> roles) {
|
public void setRoles(Set<RoleData> roles) {
|
||||||
this.roles = roles;
|
this.roles = roles;
|
||||||
}
|
}
|
||||||
|
|
@@ -28,7 +28,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
|
|||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
import top.continew.starter.core.constant.PropertiesConstants;
|
import top.continew.starter.core.constant.PropertiesConstants;
|
||||||
import top.continew.starter.extension.datapermission.filter.DataPermissionUserContextProvider;
|
import top.continew.starter.extension.datapermission.filter.DataPermissionUserDataProvider;
|
||||||
import top.continew.starter.extension.datapermission.handler.DefaultDataPermissionHandler;
|
import top.continew.starter.extension.datapermission.handler.DefaultDataPermissionHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,21 +61,21 @@ public class DataPermissionAutoConfiguration {
|
|||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean
|
@ConditionalOnMissingBean
|
||||||
public DataPermissionHandler dataPermissionHandler(DataPermissionUserContextProvider dataPermissionUserContextProvider) {
|
public DataPermissionHandler dataPermissionHandler(DataPermissionUserDataProvider dataPermissionUserDataProvider) {
|
||||||
return new DefaultDataPermissionHandler(dataPermissionUserContextProvider);
|
return new DefaultDataPermissionHandler(dataPermissionUserDataProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据权限用户上下文提供者
|
* 数据权限用户数据提供者
|
||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean
|
@ConditionalOnMissingBean
|
||||||
public DataPermissionUserContextProvider dataPermissionUserContextProvider() {
|
public DataPermissionUserDataProvider dataPermissionUserDataProvider() {
|
||||||
if (log.isErrorEnabled()) {
|
if (log.isErrorEnabled()) {
|
||||||
log.error("Consider defining a bean of type '{}' in your configuration.", ResolvableType
|
log.error("Consider defining a bean of type '{}' in your configuration.", ResolvableType
|
||||||
.forClass(DataPermissionUserContextProvider.class));
|
.forClass(DataPermissionUserDataProvider.class));
|
||||||
}
|
}
|
||||||
throw new NoSuchBeanDefinitionException(DataPermissionUserContextProvider.class);
|
throw new NoSuchBeanDefinitionException(DataPermissionUserDataProvider.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
@@ -47,9 +47,9 @@ import top.continew.starter.data.enums.DatabaseType;
|
|||||||
import top.continew.starter.data.util.MetaUtils;
|
import top.continew.starter.data.util.MetaUtils;
|
||||||
import top.continew.starter.extension.datapermission.annotation.DataPermission;
|
import top.continew.starter.extension.datapermission.annotation.DataPermission;
|
||||||
import top.continew.starter.extension.datapermission.enums.DataScope;
|
import top.continew.starter.extension.datapermission.enums.DataScope;
|
||||||
import top.continew.starter.extension.datapermission.filter.DataPermissionUserContextProvider;
|
import top.continew.starter.extension.datapermission.filter.DataPermissionUserDataProvider;
|
||||||
import top.continew.starter.extension.datapermission.model.RoleContext;
|
import top.continew.starter.extension.datapermission.model.RoleData;
|
||||||
import top.continew.starter.extension.datapermission.model.UserContext;
|
import top.continew.starter.extension.datapermission.model.UserData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 默认数据权限处理器
|
* 默认数据权限处理器
|
||||||
@@ -61,11 +61,11 @@ import top.continew.starter.extension.datapermission.model.UserContext;
|
|||||||
public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(DefaultDataPermissionHandler.class);
|
private static final Logger log = LoggerFactory.getLogger(DefaultDataPermissionHandler.class);
|
||||||
private final DataPermissionUserContextProvider dataPermissionUserContextProvider;
|
private final DataPermissionUserDataProvider dataPermissionUserDataProvider;
|
||||||
private static final DataSource dataSource = SpringUtil.getBean(DataSource.class);
|
private static final DataSource dataSource = SpringUtil.getBean(DataSource.class);
|
||||||
|
|
||||||
public DefaultDataPermissionHandler(DataPermissionUserContextProvider dataPermissionUserContextProvider) {
|
public DefaultDataPermissionHandler(DataPermissionUserDataProvider dataPermissionUserDataProvider) {
|
||||||
this.dataPermissionUserContextProvider = dataPermissionUserContextProvider;
|
this.dataPermissionUserDataProvider = dataPermissionUserDataProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -81,7 +81,7 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
if (dataPermission == null || !CharSequenceUtil.equalsAny(methodName, name, name + "_COUNT")) {
|
if (dataPermission == null || !CharSequenceUtil.equalsAny(methodName, name, name + "_COUNT")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (dataPermissionUserContextProvider.isFilter()) {
|
if (dataPermissionUserDataProvider.isFilter()) {
|
||||||
return buildDataScopeFilter(dataPermission, where);
|
return buildDataScopeFilter(dataPermission, where);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,19 +100,19 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
*/
|
*/
|
||||||
private Expression buildDataScopeFilter(DataPermission dataPermission, Expression where) {
|
private Expression buildDataScopeFilter(DataPermission dataPermission, Expression where) {
|
||||||
Expression expression = null;
|
Expression expression = null;
|
||||||
UserContext userContext = dataPermissionUserContextProvider.getUserContext();
|
UserData userData = dataPermissionUserDataProvider.getUserData();
|
||||||
Set<RoleContext> roles = userContext.getRoles();
|
Set<RoleData> roles = userData.getRoles();
|
||||||
for (RoleContext roleContext : roles) {
|
for (RoleData roleData : roles) {
|
||||||
DataScope dataScope = roleContext.getDataScope();
|
DataScope dataScope = roleData.getDataScope();
|
||||||
if (DataScope.ALL.equals(dataScope)) {
|
if (DataScope.ALL.equals(dataScope)) {
|
||||||
return where;
|
return where;
|
||||||
}
|
}
|
||||||
switch (dataScope) {
|
switch (dataScope) {
|
||||||
case DEPT_AND_CHILD -> expression = this
|
case DEPT_AND_CHILD -> expression = this
|
||||||
.buildDeptAndChildExpression(dataPermission, userContext, expression);
|
.buildDeptAndChildExpression(dataPermission, userData, expression);
|
||||||
case DEPT -> expression = this.buildDeptExpression(dataPermission, userContext, expression);
|
case DEPT -> expression = this.buildDeptExpression(dataPermission, userData, expression);
|
||||||
case SELF -> expression = this.buildSelfExpression(dataPermission, userContext, expression);
|
case SELF -> expression = this.buildSelfExpression(dataPermission, userData, expression);
|
||||||
case CUSTOM -> expression = this.buildCustomExpression(dataPermission, roleContext, expression);
|
case CUSTOM -> expression = this.buildCustomExpression(dataPermission, roleData, expression);
|
||||||
default -> throw new IllegalArgumentException("暂不支持 [%s] 数据权限".formatted(dataScope));
|
default -> throw new IllegalArgumentException("暂不支持 [%s] 数据权限".formatted(dataScope));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,12 +128,12 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param dataPermission 数据权限
|
* @param dataPermission 数据权限
|
||||||
* @param userContext 用户上下文
|
* @param userData 用户数据
|
||||||
* @param expression 处理前的表达式
|
* @param expression 处理前的表达式
|
||||||
* @return 处理完后的表达式
|
* @return 处理完后的表达式
|
||||||
*/
|
*/
|
||||||
private Expression buildDeptAndChildExpression(DataPermission dataPermission,
|
private Expression buildDeptAndChildExpression(DataPermission dataPermission,
|
||||||
UserContext userContext,
|
UserData userData,
|
||||||
Expression expression) {
|
Expression expression) {
|
||||||
ParenthesedSelect subSelect = new ParenthesedSelect();
|
ParenthesedSelect subSelect = new ParenthesedSelect();
|
||||||
PlainSelect select = new PlainSelect();
|
PlainSelect select = new PlainSelect();
|
||||||
@@ -142,14 +142,14 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
|
|
||||||
EqualsTo equalsTo = new EqualsTo();
|
EqualsTo equalsTo = new EqualsTo();
|
||||||
equalsTo.setLeftExpression(new Column(dataPermission.id()));
|
equalsTo.setLeftExpression(new Column(dataPermission.id()));
|
||||||
equalsTo.setRightExpression(new LongValue(userContext.getDeptId()));
|
equalsTo.setRightExpression(new LongValue(userData.getDeptId()));
|
||||||
|
|
||||||
DatabaseType databaseType = MetaUtils.getDatabaseType(dataSource);
|
DatabaseType databaseType = MetaUtils.getDatabaseType(dataSource);
|
||||||
Expression inSetExpression;
|
Expression inSetExpression;
|
||||||
if (DatabaseType.MYSQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
|
if (DatabaseType.MYSQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
|
||||||
Function findInSetFunction = new Function();
|
Function findInSetFunction = new Function();
|
||||||
findInSetFunction.setName("find_in_set");
|
findInSetFunction.setName("find_in_set");
|
||||||
findInSetFunction.setParameters(new ExpressionList(new LongValue(userContext
|
findInSetFunction.setParameters(new ExpressionList(new LongValue(userData
|
||||||
.getDeptId()), new Column("ancestors")));
|
.getDeptId()), new Column("ancestors")));
|
||||||
inSetExpression = findInSetFunction;
|
inSetExpression = findInSetFunction;
|
||||||
} else if (DatabaseType.POSTGRE_SQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
|
} else if (DatabaseType.POSTGRE_SQL.getDatabase().equalsIgnoreCase(databaseType.getDatabase())) {
|
||||||
@@ -160,7 +160,7 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
// 创建 LIKE 函数
|
// 创建 LIKE 函数
|
||||||
LikeExpression likeExpression = new LikeExpression();
|
LikeExpression likeExpression = new LikeExpression();
|
||||||
likeExpression.setLeftExpression(concatFunction);
|
likeExpression.setLeftExpression(concatFunction);
|
||||||
likeExpression.setRightExpression(new StringValue("%," + userContext.getDeptId() + ",%"));
|
likeExpression.setRightExpression(new StringValue("%," + userData.getDeptId() + ",%"));
|
||||||
inSetExpression = likeExpression;
|
inSetExpression = likeExpression;
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("暂不支持 [%s] 数据权限".formatted(""));
|
throw new IllegalArgumentException("暂不支持 [%s] 数据权限".formatted(""));
|
||||||
@@ -183,16 +183,14 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param dataPermission 数据权限
|
* @param dataPermission 数据权限
|
||||||
* @param userContext 用户上下文
|
* @param userData 用户数据
|
||||||
* @param expression 处理前的表达式
|
* @param expression 处理前的表达式
|
||||||
* @return 处理完后的表达式
|
* @return 处理完后的表达式
|
||||||
*/
|
*/
|
||||||
private Expression buildDeptExpression(DataPermission dataPermission,
|
private Expression buildDeptExpression(DataPermission dataPermission, UserData userData, Expression expression) {
|
||||||
UserContext userContext,
|
|
||||||
Expression expression) {
|
|
||||||
EqualsTo equalsTo = new EqualsTo();
|
EqualsTo equalsTo = new EqualsTo();
|
||||||
equalsTo.setLeftExpression(this.buildColumn(dataPermission.tableAlias(), dataPermission.deptId()));
|
equalsTo.setLeftExpression(this.buildColumn(dataPermission.tableAlias(), dataPermission.deptId()));
|
||||||
equalsTo.setRightExpression(new LongValue(userContext.getDeptId()));
|
equalsTo.setRightExpression(new LongValue(userData.getDeptId()));
|
||||||
return expression != null ? new OrExpression(expression, equalsTo) : equalsTo;
|
return expression != null ? new OrExpression(expression, equalsTo) : equalsTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,16 +202,14 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param dataPermission 数据权限
|
* @param dataPermission 数据权限
|
||||||
* @param userContext 用户上下文
|
* @param userData 用户数据
|
||||||
* @param expression 处理前的表达式
|
* @param expression 处理前的表达式
|
||||||
* @return 处理完后的表达式
|
* @return 处理完后的表达式
|
||||||
*/
|
*/
|
||||||
private Expression buildSelfExpression(DataPermission dataPermission,
|
private Expression buildSelfExpression(DataPermission dataPermission, UserData userData, Expression expression) {
|
||||||
UserContext userContext,
|
|
||||||
Expression expression) {
|
|
||||||
EqualsTo equalsTo = new EqualsTo();
|
EqualsTo equalsTo = new EqualsTo();
|
||||||
equalsTo.setLeftExpression(this.buildColumn(dataPermission.tableAlias(), dataPermission.userId()));
|
equalsTo.setLeftExpression(this.buildColumn(dataPermission.tableAlias(), dataPermission.userId()));
|
||||||
equalsTo.setRightExpression(new LongValue(userContext.getUserId()));
|
equalsTo.setRightExpression(new LongValue(userData.getUserId()));
|
||||||
return expression != null ? new OrExpression(expression, equalsTo) : equalsTo;
|
return expression != null ? new OrExpression(expression, equalsTo) : equalsTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,20 +222,18 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
|
|||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param dataPermission 数据权限
|
* @param dataPermission 数据权限
|
||||||
* @param roleContext 角色上下文
|
* @param roleData 角色上下文
|
||||||
* @param expression 处理前的表达式
|
* @param expression 处理前的表达式
|
||||||
* @return 处理完后的表达式
|
* @return 处理完后的表达式
|
||||||
*/
|
*/
|
||||||
private Expression buildCustomExpression(DataPermission dataPermission,
|
private Expression buildCustomExpression(DataPermission dataPermission, RoleData roleData, Expression expression) {
|
||||||
RoleContext roleContext,
|
|
||||||
Expression expression) {
|
|
||||||
ParenthesedSelect subSelect = new ParenthesedSelect();
|
ParenthesedSelect subSelect = new ParenthesedSelect();
|
||||||
PlainSelect select = new PlainSelect();
|
PlainSelect select = new PlainSelect();
|
||||||
select.setSelectItems(Collections.singletonList(new SelectItem<>(new Column(dataPermission.deptId()))));
|
select.setSelectItems(Collections.singletonList(new SelectItem<>(new Column(dataPermission.deptId()))));
|
||||||
select.setFromItem(new Table(dataPermission.roleDeptTableAlias()));
|
select.setFromItem(new Table(dataPermission.roleDeptTableAlias()));
|
||||||
EqualsTo equalsTo = new EqualsTo();
|
EqualsTo equalsTo = new EqualsTo();
|
||||||
equalsTo.setLeftExpression(new Column(dataPermission.roleId()));
|
equalsTo.setLeftExpression(new Column(dataPermission.roleId()));
|
||||||
equalsTo.setRightExpression(new LongValue(roleContext.getRoleId()));
|
equalsTo.setRightExpression(new LongValue(roleData.getRoleId()));
|
||||||
select.setWhere(equalsTo);
|
select.setWhere(equalsTo);
|
||||||
subSelect.setSelect(select);
|
subSelect.setSelect(select);
|
||||||
// 构建父查询
|
// 构建父查询
|
||||||
|
@@ -52,7 +52,7 @@ public class TenantProperties {
|
|||||||
private String tenantIdHeader = "X-Tenant-Id";
|
private String tenantIdHeader = "X-Tenant-Id";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 超级/默认租户 ID
|
* 超级/默认租户 ID(超管用户所在租户)
|
||||||
*/
|
*/
|
||||||
private Long superTenantId = 0L;
|
private Long superTenantId = 0L;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user