first commit
This commit is contained in:
@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import com.qiaoba.auth.annotation.DataScope;
|
import com.qiaoba.auth.annotation.DataScope;
|
||||||
import com.qiaoba.auth.entity.LoginUser;
|
import com.qiaoba.auth.entity.LoginUser;
|
||||||
import com.qiaoba.auth.entity.dto.RoleDto;
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
|
import com.qiaoba.common.base.utils.DatabaseUtil;
|
||||||
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.JoinPoint;
|
||||||
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
import org.aspectj.lang.annotation.Before;
|
import org.aspectj.lang.annotation.Before;
|
||||||
@ -59,10 +60,10 @@ public class DataScopeAspect {
|
|||||||
/**
|
/**
|
||||||
* 数据范围过滤
|
* 数据范围过滤
|
||||||
*
|
*
|
||||||
* @param joinPoint 切点
|
* @param joinPoint 切点
|
||||||
* @param user 用户
|
* @param user 用户
|
||||||
* @param deptAlias 部门别名
|
* @param deptAlias 部门别名
|
||||||
* @param userAlias 用户别名
|
* @param userAlias 用户别名
|
||||||
*/
|
*/
|
||||||
public static void dataScopeFilter(JoinPoint joinPoint, LoginUser user, String deptAlias, String userAlias) {
|
public static void dataScopeFilter(JoinPoint joinPoint, LoginUser user, String deptAlias, String userAlias) {
|
||||||
StringBuilder sqlString = new StringBuilder();
|
StringBuilder sqlString = new StringBuilder();
|
||||||
@ -86,9 +87,8 @@ public class DataScopeAspect {
|
|||||||
sqlString.append(StrUtil.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
|
sqlString.append(StrUtil.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
|
||||||
} else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
|
} else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
|
||||||
sqlString.append(StrUtil.format(
|
sqlString.append(StrUtil.format(
|
||||||
// todo
|
|
||||||
" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or {} )",
|
" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or {} )",
|
||||||
deptAlias, user.getDeptId(), user.getDeptId()));
|
deptAlias, user.getDeptId(), DatabaseUtil.handleFindInSet(user.getDeptId(), "ancestors")));
|
||||||
} else if (DATA_SCOPE_SELF.equals(dataScope)) {
|
} else if (DATA_SCOPE_SELF.equals(dataScope)) {
|
||||||
if (StrUtil.isNotBlank(userAlias)) {
|
if (StrUtil.isNotBlank(userAlias)) {
|
||||||
sqlString.append(StrUtil.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
|
sqlString.append(StrUtil.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
|
||||||
@ -104,7 +104,6 @@ public class DataScopeAspect {
|
|||||||
if (CollUtil.isEmpty(conditions)) {
|
if (CollUtil.isEmpty(conditions)) {
|
||||||
sqlString.append(StrUtil.format(" OR {}.dept_id = 0 ", deptAlias));
|
sqlString.append(StrUtil.format(" OR {}.dept_id = 0 ", deptAlias));
|
||||||
}
|
}
|
||||||
//find_in_set( {} , ancestors )
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,13 +60,14 @@ public class LoginUser implements UserDetails {
|
|||||||
public LoginUser() {
|
public LoginUser() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public LoginUser(String userId, String deptId, String username, String nickname, List<String> roleKeys, Set<String> permissions) {
|
public LoginUser(String userId, String deptId, String username, String nickname, List<RoleDto> roles, List<String> roleKeys, Set<String> permissions) {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
this.deptId = deptId;
|
this.deptId = deptId;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.permissions = permissions;
|
this.permissions = permissions;
|
||||||
this.nickname = nickname;
|
this.nickname = nickname;
|
||||||
this.roleKeys = roleKeys;
|
this.roleKeys = roleKeys;
|
||||||
|
this.roles = roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<RoleDto> getRoles() {
|
public List<RoleDto> getRoles() {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.qiaoba.auth.entity;
|
package com.qiaoba.auth.entity;
|
||||||
|
|
||||||
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@ -40,16 +41,20 @@ public class SecurityUser implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String nickname;
|
private String nickname;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色列表
|
* 角色列表
|
||||||
*/
|
*/
|
||||||
private List<String> roleKeys;
|
private List<RoleDto> roles;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色Key列表
|
||||||
|
*/
|
||||||
|
private List<String> roleKeys;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 权限列表
|
* 权限列表
|
||||||
*/
|
*/
|
||||||
private Set<String> permissions;
|
private Set<String> permissions;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,5 +14,6 @@ public class RoleDto {
|
|||||||
|
|
||||||
private String roleId;
|
private String roleId;
|
||||||
private String roleKey;
|
private String roleKey;
|
||||||
|
private String roleName;
|
||||||
private String dataScope;
|
private String dataScope;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
package com.qiaoba.common.base.context;
|
package com.qiaoba.common.base.context;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局上下文对象
|
* 全局上下文对象
|
||||||
*
|
*
|
||||||
@ -12,31 +9,74 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class BaseContext {
|
public class BaseContext {
|
||||||
|
|
||||||
private static final String DATABASE_TYPE_MAP_KEY = "databaseType";
|
/**
|
||||||
|
* 数据库类型
|
||||||
|
*/
|
||||||
|
private static final ThreadLocal<String> DATABASE_TYPE_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
private static final ThreadLocal<Map<String, Object>> CONTEXT_HOLDER = new ThreadLocal<>();
|
/**
|
||||||
|
* 租户ID
|
||||||
|
*/
|
||||||
|
private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据源
|
||||||
|
*/
|
||||||
|
private static final ThreadLocal<String> DATASOURCE_HOLDER = new ThreadLocal<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取上下文中数据库类型
|
||||||
|
*/
|
||||||
|
public static String getDatabaseType() {
|
||||||
|
return DATABASE_TYPE_HOLDER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置上下文中数据库类型
|
||||||
|
*/
|
||||||
|
public static void setDatabaseType(String type) {
|
||||||
|
DATABASE_TYPE_HOLDER.set(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取上下文中租户ID
|
||||||
|
*/
|
||||||
|
public static String getTenantId() {
|
||||||
|
return TENANT_ID_HOLDER.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置上下文中租户ID
|
||||||
|
*/
|
||||||
|
public static void setTenantId(String tenantId) {
|
||||||
|
TENANT_ID_HOLDER.set(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取上下文中的数据源
|
* 获取上下文中的数据源
|
||||||
*/
|
*/
|
||||||
public String getDatabaseType() {
|
public static String getDataSource() {
|
||||||
return CONTEXT_HOLDER.get().get(DATABASE_TYPE_MAP_KEY).toString();
|
return DATASOURCE_HOLDER.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置上下文中的数据源
|
* 设置上下文中的数据源
|
||||||
*/
|
*/
|
||||||
public void setDatabaseType(String type) {
|
public static void setDataSource(String dataSource) {
|
||||||
Map<String, Object> map = new HashMap<>(1);
|
DATASOURCE_HOLDER.set(dataSource);
|
||||||
map.put(DATABASE_TYPE_MAP_KEY, type);
|
|
||||||
CONTEXT_HOLDER.set(map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清除上下文中的数据源
|
* 清除所有的ThreadLocal
|
||||||
*/
|
*/
|
||||||
public void clearDataSource() {
|
public static void clearAllHolder() {
|
||||||
CONTEXT_HOLDER.remove();
|
// 清除上下文中数据源
|
||||||
|
DATASOURCE_HOLDER.remove();
|
||||||
|
// 清除上下文中租户ID
|
||||||
|
TENANT_ID_HOLDER.remove();
|
||||||
|
// 清除上下文中数据库类型
|
||||||
|
DATABASE_TYPE_HOLDER.remove();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package com.qiaoba.common.database.enums;
|
package com.qiaoba.common.base.enums;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -48,4 +48,5 @@ public enum DataBaseTypeEnum {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,16 +1,10 @@
|
|||||||
package com.qiaoba.common.database.utils;
|
package com.qiaoba.common.base.utils;
|
||||||
|
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import com.qiaoba.common.base.exceptions.ServiceException;
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
|
import com.qiaoba.common.base.enums.DataBaseTypeEnum;
|
||||||
import com.qiaoba.common.database.enums.DataBaseTypeEnum;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.DatabaseMetaData;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 数据库工具类
|
* 数据库工具类
|
||||||
*
|
*
|
||||||
@ -21,23 +15,15 @@ import java.sql.SQLException;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class DatabaseUtil {
|
public class DatabaseUtil {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前数据库类型
|
* 根据数据库类型,处理find_in_set函数
|
||||||
|
*
|
||||||
|
* @param var1 参数1
|
||||||
|
* @param var2 参数2
|
||||||
|
* @return 处理后的sql
|
||||||
*/
|
*/
|
||||||
public static DataBaseTypeEnum getDataBaseType() {
|
|
||||||
DataSource dataSource = (DataSource) DynamicDataSourceConfig.DATA_SOURCE_MAP.get("");
|
|
||||||
try (Connection conn = dataSource.getConnection()) {
|
|
||||||
DatabaseMetaData metaData = conn.getMetaData();
|
|
||||||
String databaseProductName = metaData.getDatabaseProductName();
|
|
||||||
return DataBaseTypeEnum.find(databaseProductName);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
throw new ServiceException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String handleFindInSet(Object var1, String var2) {
|
public static String handleFindInSet(Object var1, String var2) {
|
||||||
DataBaseTypeEnum dataBaseType = getDataBaseType();
|
DataBaseTypeEnum dataBaseType = DataBaseTypeEnum.find(BaseContext.getDatabaseType());
|
||||||
String var = Convert.toStr(var1);
|
String var = Convert.toStr(var1);
|
||||||
if (dataBaseType == DataBaseTypeEnum.SQL_SERVER) {
|
if (dataBaseType == DataBaseTypeEnum.SQL_SERVER) {
|
||||||
// charindex(',100,' , ',0,100,101,') <> 0
|
// charindex(',100,' , ',0,100,101,') <> 0
|
@ -1,30 +0,0 @@
|
|||||||
package com.qiaoba.common.base.utils;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 租户工具类
|
|
||||||
*
|
|
||||||
* @author ailanyin
|
|
||||||
* @version 1.0
|
|
||||||
* @since 2023/5/9 12:57
|
|
||||||
*/
|
|
||||||
public class TenantUtil {
|
|
||||||
|
|
||||||
private static final ThreadLocal<String> TENANT_ID_HOLDER = new ThreadLocal<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取登录用户的租户ID
|
|
||||||
*
|
|
||||||
* @return username
|
|
||||||
*/
|
|
||||||
public static String getTenantId() {
|
|
||||||
return TENANT_ID_HOLDER.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearTenantId() {
|
|
||||||
TENANT_ID_HOLDER.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setTenantId(String tenantId) {
|
|
||||||
TENANT_ID_HOLDER.set(tenantId);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,6 @@
|
|||||||
package com.qiaoba.common.database.config;
|
package com.qiaoba.common.database.config;
|
||||||
|
|
||||||
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
||||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||||
|
|
||||||
@ -15,9 +16,6 @@ import java.util.Map;
|
|||||||
public class DynamicDataSourceContext extends AbstractRoutingDataSource {
|
public class DynamicDataSourceContext extends AbstractRoutingDataSource {
|
||||||
|
|
||||||
|
|
||||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置默认数据源、全部数据源,及刷新
|
* 设置默认数据源、全部数据源,及刷新
|
||||||
*/
|
*/
|
||||||
@ -33,7 +31,7 @@ public class DynamicDataSourceContext extends AbstractRoutingDataSource {
|
|||||||
@Override
|
@Override
|
||||||
protected Object determineCurrentLookupKey() {
|
protected Object determineCurrentLookupKey() {
|
||||||
//获取当前指定的数据源
|
//获取当前指定的数据源
|
||||||
return getDataSource();
|
return BaseContext.getDataSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -41,24 +39,4 @@ public class DynamicDataSourceContext extends AbstractRoutingDataSource {
|
|||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取上下文中的数据源
|
|
||||||
*/
|
|
||||||
public String getDataSource() {
|
|
||||||
return CONTEXT_HOLDER.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置上下文中的数据源
|
|
||||||
*/
|
|
||||||
public void setDataSource(String dataSource) {
|
|
||||||
CONTEXT_HOLDER.set(dataSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清除上下文中的数据源
|
|
||||||
*/
|
|
||||||
public void clearDataSource() {
|
|
||||||
CONTEXT_HOLDER.remove();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
|
||||||
import com.qiaoba.common.base.utils.TenantUtil;
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Expression;
|
||||||
import net.sf.jsqlparser.expression.StringValue;
|
import net.sf.jsqlparser.expression.StringValue;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
@ -26,7 +26,7 @@ public class MybatisPlusConfig {
|
|||||||
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
|
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
|
||||||
@Override
|
@Override
|
||||||
public Expression getTenantId() {
|
public Expression getTenantId() {
|
||||||
return new StringValue(TenantUtil.getTenantId());
|
return new StringValue(BaseContext.getTenantId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
package com.qiaoba.common.database.filters;
|
package com.qiaoba.common.database.filters;
|
||||||
|
|
||||||
import com.qiaoba.common.base.utils.TenantUtil;
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
import com.qiaoba.common.database.config.DynamicDataSourceContext;
|
||||||
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
import com.qiaoba.common.database.constants.DynamicDatasourceConstant;
|
||||||
import com.qiaoba.common.database.utils.DatabaseUtil;
|
|
||||||
import com.qiaoba.common.web.utils.ResponseUtil;
|
import com.qiaoba.common.web.utils.ResponseUtil;
|
||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -33,14 +32,9 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
//设置当前租户对应的数据库
|
before();
|
||||||
dynamicDataSourceContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY);
|
|
||||||
// todo
|
|
||||||
TenantUtil.setTenantId("1");
|
|
||||||
DatabaseUtil.handleFindInSet();
|
|
||||||
filterChain.doFilter(request, response);
|
filterChain.doFilter(request, response);
|
||||||
dynamicDataSourceContext.clearDataSource();
|
after();
|
||||||
TenantUtil.clearTenantId();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException {
|
private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException {
|
||||||
@ -49,4 +43,17 @@ public class DynamicDataSourceFilter extends OncePerRequestFilter {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void before() {
|
||||||
|
// todo
|
||||||
|
//设置当前租户对应的数据源
|
||||||
|
BaseContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY);
|
||||||
|
//设置当前租户对应的租户ID
|
||||||
|
BaseContext.setTenantId("1");
|
||||||
|
//设置当前租户对应的数据库类型
|
||||||
|
BaseContext.setDatabaseType("MySQL");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void after() {
|
||||||
|
BaseContext.clearAllHolder();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.qiaoba.common.database.interceptors;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.ibatis.executor.statement.StatementHandler;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class SchemaInterceptor implements InnerInterceptor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforePrepare(StatementHandler sh, Connection conn, Integer transactionTimeout) {
|
||||||
|
String sql = "use `qiaoba-boot`;";
|
||||||
|
try {
|
||||||
|
conn.createStatement().execute(sql);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
InnerInterceptor.super.beforePrepare(sh, conn, transactionTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package com.qiaoba.common.redis.service.impl;
|
package com.qiaoba.common.redis.service.impl;
|
||||||
|
|
||||||
|
|
||||||
import com.qiaoba.common.base.utils.TenantUtil;
|
import com.qiaoba.common.base.context.BaseContext;
|
||||||
import com.qiaoba.common.redis.service.RedisService;
|
import com.qiaoba.common.redis.service.RedisService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
@ -231,7 +231,7 @@ public class RedisServiceImpl implements RedisService {
|
|||||||
|
|
||||||
private String handleKey(String key) {
|
private String handleKey(String key) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("tenant_").append(TenantUtil.getTenantId()).append(":").append(key);
|
sb.append("tenant_").append(BaseContext.getTenantId()).append(":").append(key);
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.qiaoba.module.system.mapper;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.qiaoba.api.system.entity.SysUserRole;
|
import com.qiaoba.api.system.entity.SysUserRole;
|
||||||
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -24,24 +25,6 @@ public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
|
|||||||
*/
|
*/
|
||||||
List<String> selectRoleIdsByUserId(@Param("userId") String userId, @Param("status") String status);
|
List<String> selectRoleIdsByUserId(@Param("userId") String userId, @Param("status") String status);
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过userId查询所绑定的角色Key列表
|
|
||||||
*
|
|
||||||
* @param userId userId
|
|
||||||
* @param status 状态
|
|
||||||
* @return roleIds
|
|
||||||
*/
|
|
||||||
List<String> selectRoleKeysByUserId(@Param("userId") String userId, @Param("status") String status);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过userId查询所绑定的角色Key列表
|
|
||||||
*
|
|
||||||
* @param userId userId
|
|
||||||
* @param status 状态
|
|
||||||
* @return roleIds
|
|
||||||
*/
|
|
||||||
List<String> selectRoleNamesByUserId(@Param("userId") String userId, @Param("status") String status);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量取消角色所绑定的用户
|
* 批量取消角色所绑定的用户
|
||||||
*
|
*
|
||||||
@ -56,4 +39,13 @@ public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
|
|||||||
* @param userIds userIds
|
* @param userIds userIds
|
||||||
*/
|
*/
|
||||||
void deleteByUserIds(@Param("list") List<String> userIds);
|
void deleteByUserIds(@Param("list") List<String> userIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过userId查询所绑定的角色(id + name)列表
|
||||||
|
*
|
||||||
|
* @param userId userId
|
||||||
|
* @param status 状态
|
||||||
|
* @return roles
|
||||||
|
*/
|
||||||
|
List<RoleDto> selectRoleDtoByUserId(@Param("userId") String userId, @Param("status") String status);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.qiaoba.module.system.service;
|
package com.qiaoba.module.system.service;
|
||||||
|
|
||||||
import com.qiaoba.api.system.entity.SysUserRole;
|
import com.qiaoba.api.system.entity.SysUserRole;
|
||||||
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -52,22 +53,14 @@ public interface SysUserRoleService {
|
|||||||
List<String> selectRoleIdsByUserId(String userId, String status);
|
List<String> selectRoleIdsByUserId(String userId, String status);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过userId查询所绑定的角色Key列表
|
* 通过userId查询所绑定的角色(id + name)列表
|
||||||
*
|
*
|
||||||
* @param userId userId
|
* @param userId userId
|
||||||
* @param status 状态
|
* @param status 状态
|
||||||
* @return roleIds
|
* @return roles
|
||||||
*/
|
*/
|
||||||
List<String> selectRoleKeysByUserId(String userId, String status);
|
List<RoleDto> selectRoleDtoByUserId(String userId, String status);
|
||||||
|
|
||||||
/**
|
|
||||||
* 通过userId查询所绑定的角色Key列表
|
|
||||||
*
|
|
||||||
* @param userId userId
|
|
||||||
* @param status 状态
|
|
||||||
* @return roleNames
|
|
||||||
*/
|
|
||||||
List<String> selectRoleNamesByUserId(String userId, String status);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量选择用户授权
|
* 批量选择用户授权
|
||||||
|
@ -7,6 +7,7 @@ import com.qiaoba.api.system.service.SysUserDetailsApiService;
|
|||||||
import com.qiaoba.auth.constants.SecurityConstant;
|
import com.qiaoba.auth.constants.SecurityConstant;
|
||||||
import com.qiaoba.auth.entity.LoginUser;
|
import com.qiaoba.auth.entity.LoginUser;
|
||||||
import com.qiaoba.auth.entity.SecurityUser;
|
import com.qiaoba.auth.entity.SecurityUser;
|
||||||
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
import com.qiaoba.common.base.enums.BaseEnum;
|
import com.qiaoba.common.base.enums.BaseEnum;
|
||||||
import com.qiaoba.common.redis.service.RedisService;
|
import com.qiaoba.common.redis.service.RedisService;
|
||||||
import com.qiaoba.module.system.service.SysMenuService;
|
import com.qiaoba.module.system.service.SysMenuService;
|
||||||
@ -20,6 +21,7 @@ import org.springframework.stereotype.Service;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户权限验证处理
|
* 用户权限验证处理
|
||||||
@ -41,7 +43,7 @@ public class SysUserDetailsServiceImpl implements UserDetailsService, SysUserDet
|
|||||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||||
if (redisService.hasKey(SecurityConstant.USER_DETAILS_REDIS_KEY + username)) {
|
if (redisService.hasKey(SecurityConstant.USER_DETAILS_REDIS_KEY + username)) {
|
||||||
SecurityUser user = redisService.getObject(SecurityConstant.USER_DETAILS_REDIS_KEY + username, SecurityUser.class);
|
SecurityUser user = redisService.getObject(SecurityConstant.USER_DETAILS_REDIS_KEY + username, SecurityUser.class);
|
||||||
return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoleKeys(), user.getPermissions());
|
return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), user.getRoles(), user.getRoleKeys(), user.getPermissions());
|
||||||
}
|
}
|
||||||
|
|
||||||
return toCache(username);
|
return toCache(username);
|
||||||
@ -50,8 +52,9 @@ public class SysUserDetailsServiceImpl implements UserDetailsService, SysUserDet
|
|||||||
|
|
||||||
private UserDetails createUserDetails(SysUser user) {
|
private UserDetails createUserDetails(SysUser user) {
|
||||||
Set<String> perms = sysMenuService.selectPermsByUserId(user.getUserId());
|
Set<String> perms = sysMenuService.selectPermsByUserId(user.getUserId());
|
||||||
List<String> roleKeys = sysUserRoleService.selectRoleKeysByUserId(user.getUserId(), BaseEnum.NORMAL.getCode());
|
List<RoleDto> roles = sysUserRoleService.selectRoleDtoByUserId(user.getUserId(), BaseEnum.NORMAL.getCode());
|
||||||
return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roleKeys, perms);
|
List<String> roleKeys = roles.stream().map(RoleDto::getRoleKey).collect(Collectors.toList());
|
||||||
|
return new LoginUser(user.getUserId(), user.getDeptId(), user.getUsername(), user.getNickname(), roles, roleKeys, perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
||||||
import com.qiaoba.api.system.entity.SysUserRole;
|
import com.qiaoba.api.system.entity.SysUserRole;
|
||||||
|
import com.qiaoba.auth.entity.dto.RoleDto;
|
||||||
import com.qiaoba.common.base.constants.BaseConstant;
|
import com.qiaoba.common.base.constants.BaseConstant;
|
||||||
import com.qiaoba.common.base.enums.BaseEnum;
|
import com.qiaoba.common.base.enums.BaseEnum;
|
||||||
import com.qiaoba.module.system.mapper.SysUserRoleMapper;
|
import com.qiaoba.module.system.mapper.SysUserRoleMapper;
|
||||||
@ -13,7 +14,9 @@ import lombok.RequiredArgsConstructor;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户角色关联 服务层实现
|
* 用户角色关联 服务层实现
|
||||||
@ -54,13 +57,8 @@ public class SysUserRoleServiceImpl implements SysUserRoleService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> selectRoleKeysByUserId(String userId, String status) {
|
public List<RoleDto> selectRoleDtoByUserId(String userId, String status) {
|
||||||
return sysUserRoleMapper.selectRoleKeysByUserId(userId, status);
|
return sysUserRoleMapper.selectRoleDtoByUserId(userId, status);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<String> selectRoleNamesByUserId(String userId, String status) {
|
|
||||||
return sysUserRoleMapper.selectRoleNamesByUserId(userId, status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -74,8 +72,9 @@ public class SysUserRoleServiceImpl implements SysUserRoleService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String selectRoleGroup(String userId) {
|
public String selectRoleGroup(String userId) {
|
||||||
List<String> list = selectRoleNamesByUserId(userId, BaseEnum.NORMAL.getCode());
|
List<RoleDto> list = selectRoleDtoByUserId(userId, BaseEnum.NORMAL.getCode());
|
||||||
return CollUtil.isNotEmpty(list) ? StrUtil.join(BaseConstant.LINE_JOIN_STR, list) : StrUtil.EMPTY;
|
List<String> names = list.stream().map(RoleDto::getRoleName).collect(Collectors.toList());
|
||||||
|
return CollUtil.isNotEmpty(list) ? StrUtil.join(BaseConstant.LINE_JOIN_STR, names) : StrUtil.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
private QueryWrapper<SysUserRole> createWrapper(String userId) {
|
private QueryWrapper<SysUserRole> createWrapper(String userId) {
|
||||||
|
@ -13,17 +13,8 @@
|
|||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectRoleKeysByUserId" resultType="string">
|
<select id="selectRoleDtoByUserId" resultType="com.qiaoba.auth.entity.dto.RoleDto">
|
||||||
select t2.role_key from sys_user_role t1
|
select t2.role_id,t2.role_key,t2.role_name,t2.data_scope from sys_user_role t1
|
||||||
left join sys_role t2 on t2.role_id = t1.role_id
|
|
||||||
where t1.user_id = #{userId}
|
|
||||||
<if test="status != null and status != ''">
|
|
||||||
and t2.status = #{status}
|
|
||||||
</if>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectRoleNamesByUserId" resultType="string">
|
|
||||||
select t2.role_name from sys_user_role t1
|
|
||||||
left join sys_role t2 on t2.role_id = t1.role_id
|
left join sys_role t2 on t2.role_id = t1.role_id
|
||||||
where t1.user_id = #{userId}
|
where t1.user_id = #{userId}
|
||||||
<if test="status != null and status != ''">
|
<if test="status != null and status != ''">
|
||||||
|
Reference in New Issue
Block a user