update 完美修复 数据权限功能(支持单表多表过滤)

This commit is contained in:
疯狂的狮子li 2021-05-30 02:20:21 +08:00
parent 6192d42564
commit 6d5a0d8a7e
4 changed files with 114 additions and 136 deletions

View File

@ -25,4 +25,9 @@ public @interface DataScope
* 用户表的别名 * 用户表的别名
*/ */
public String userAlias() default ""; public String userAlias() default "";
/**
* 是否过滤用户权限
*/
public boolean isUser() default false;
} }

View File

@ -24,12 +24,12 @@ import java.util.Map;
/** /**
* 数据过滤处理 * 数据过滤处理
* *
* @author ruoyi * @author Lion Li
*/ */
@Aspect @Aspect
@Component @Component
public class DataScopeAspect public class DataScopeAspect {
{
/** /**
* 全部数据权限 * 全部数据权限
*/ */
@ -62,35 +62,29 @@ public class DataScopeAspect
// 配置织入点 // 配置织入点
@Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)") @Pointcut("@annotation(com.ruoyi.common.annotation.DataScope)")
public void dataScopePointCut() public void dataScopePointCut() {
{
} }
@Before("dataScopePointCut()") @Before("dataScopePointCut()")
public void doBefore(JoinPoint point) throws Throwable public void doBefore(JoinPoint point) throws Throwable {
{
clearDataScope(point); clearDataScope(point);
handleDataScope(point); handleDataScope(point);
} }
protected void handleDataScope(final JoinPoint joinPoint) protected void handleDataScope(final JoinPoint joinPoint) {
{
// 获得注解 // 获得注解
DataScope controllerDataScope = getAnnotationLog(joinPoint); DataScope controllerDataScope = getAnnotationLog(joinPoint);
if (controllerDataScope == null) if (controllerDataScope == null) {
{
return; return;
} }
// 获取当前的用户 // 获取当前的用户
LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
if (Validator.isNotNull(loginUser)) if (Validator.isNotNull(loginUser)) {
{
SysUser currentUser = loginUser.getUser(); SysUser currentUser = loginUser.getUser();
// 如果是超级管理员则不过滤数据 // 如果是超级管理员则不过滤数据
if (Validator.isNotNull(currentUser) && !currentUser.isAdmin()) if (Validator.isNotNull(currentUser) && !currentUser.isAdmin()) {
{
dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
controllerDataScope.userAlias()); controllerDataScope.userAlias(), controllerDataScope.isUser());
} }
} }
} }
@ -102,54 +96,41 @@ public class DataScopeAspect
* @param user 用户 * @param user 用户
* @param userAlias 别名 * @param userAlias 别名
*/ */
public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias) public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, boolean isUser) {
{
StringBuilder sqlString = new StringBuilder(); StringBuilder sqlString = new StringBuilder();
// "." 提取出,不写别名为单表查询,写别名为多表查询 // "." 提取出,不写别名为单表查询,写别名为多表查询
deptAlias = StrUtil.isNotBlank(deptAlias) ? deptAlias + "." : ""; deptAlias = StrUtil.isNotBlank(deptAlias) ? deptAlias + "." : "";
userAlias = StrUtil.isNotBlank(userAlias) ? userAlias + "." : ""; userAlias = StrUtil.isNotBlank(userAlias) ? userAlias + "." : "";
for (SysRole role : user.getRoles()) for (SysRole role : user.getRoles()) {
{
String dataScope = role.getDataScope(); String dataScope = role.getDataScope();
if (DATA_SCOPE_ALL.equals(dataScope)) if (DATA_SCOPE_ALL.equals(dataScope)) {
{
sqlString = new StringBuilder(); sqlString = new StringBuilder();
break; break;
} } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
else if (DATA_SCOPE_CUSTOM.equals(dataScope))
{
sqlString.append(StrUtil.format( sqlString.append(StrUtil.format(
" OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, " OR {}dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ",
role.getRoleId())); deptAlias, role.getRoleId()));
} } else if (DATA_SCOPE_DEPT.equals(dataScope)) {
else if (DATA_SCOPE_DEPT.equals(dataScope)) 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(
" OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", " OR {}dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
deptAlias, user.getDeptId(), user.getDeptId())); deptAlias, user.getDeptId(), user.getDeptId()));
} } else if (DATA_SCOPE_SELF.equals(dataScope)) {
else if (DATA_SCOPE_SELF.equals(dataScope)) if (isUser) {
{ sqlString.append(StrUtil.format(" OR {}user_id = {} ",
if (StrUtil.isNotBlank(userAlias)) userAlias, user.getUserId()));
{ } else {
sqlString.append(StrUtil.format(" OR {}user_id = {} ", userAlias, user.getUserId()));
}
else
{
// 数据权限为仅本人且没有userAlias别名不查询任何数据 // 数据权限为仅本人且没有userAlias别名不查询任何数据
sqlString.append(" OR 1=0 "); sqlString.append(" OR 1=0 ");
} }
} }
} }
if (StrUtil.isNotBlank(sqlString.toString())) if (StrUtil.isNotBlank(sqlString.toString())) {
{
putDataScope(joinPoint, sqlString.substring(4)); putDataScope(joinPoint, sqlString.substring(4));
} }
} }
@ -157,14 +138,12 @@ public class DataScopeAspect
/** /**
* 是否存在注解如果存在就获取 * 是否存在注解如果存在就获取
*/ */
private DataScope getAnnotationLog(JoinPoint joinPoint) private DataScope getAnnotationLog(JoinPoint joinPoint) {
{
Signature signature = joinPoint.getSignature(); Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature; MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod(); Method method = methodSignature.getMethod();
if (method != null) if (method != null) {
{
return method.getAnnotation(DataScope.class); return method.getAnnotation(DataScope.class);
} }
return null; return null;
@ -173,19 +152,16 @@ public class DataScopeAspect
/** /**
* 拼接权限sql前先清空params.dataScope参数防止注入 * 拼接权限sql前先清空params.dataScope参数防止注入
*/ */
private void clearDataScope(final JoinPoint joinPoint) private void clearDataScope(final JoinPoint joinPoint) {
{
Object params = joinPoint.getArgs()[0]; Object params = joinPoint.getArgs()[0];
if (Validator.isNotNull(params)) if (Validator.isNotNull(params)) {
{
putDataScope(joinPoint, ""); putDataScope(joinPoint, "");
} }
} }
private static void putDataScope(JoinPoint joinPoint, String sql) { private static void putDataScope(JoinPoint joinPoint, String sql) {
Object params = joinPoint.getArgs()[0]; Object params = joinPoint.getArgs()[0];
if (Validator.isNotNull(params)) if (Validator.isNotNull(params)) {
{
if (params instanceof BaseEntity) { if (params instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity) params; BaseEntity baseEntity = (BaseEntity) params;
baseEntity.getParams().put(DATA_SCOPE, sql); baseEntity.getParams().put(DATA_SCOPE, sql);

View File

@ -32,9 +32,6 @@ import java.util.Map;
@Service @Service
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService { public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService {
@Autowired
private SysConfigMapper configMapper;
@Autowired @Autowired
private RedisCache redisCache; private RedisCache redisCache;
@ -160,7 +157,7 @@ public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig
if (StrUtil.equals(UserConstants.YES, config.getConfigType())) { if (StrUtil.equals(UserConstants.YES, config.getConfigType())) {
throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey()));
} }
configMapper.deleteById(configId); baseMapper.deleteById(configId);
redisCache.deleteObject(getCacheKey(config.getConfigKey())); redisCache.deleteObject(getCacheKey(config.getConfigKey()));
} }
} }

View File

@ -52,7 +52,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
private ISysConfigService configService; private ISysConfigService configService;
@Override @Override
@DataScope(deptAlias = "d", userAlias = "u") @DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public TableDataInfo<SysUser> selectPageUserList(SysUser user) { public TableDataInfo<SysUser> selectPageUserList(SysUser user) {
return PageUtils.buildDataInfo(baseMapper.selectPageUserList(PageUtils.buildPage(), user)); return PageUtils.buildDataInfo(baseMapper.selectPageUserList(PageUtils.buildPage(), user));
} }
@ -64,7 +64,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
* @return 用户信息集合信息 * @return 用户信息集合信息
*/ */
@Override @Override
@DataScope(deptAlias = "d", userAlias = "u") @DataScope(deptAlias = "d", userAlias = "u", isUser = true)
public List<SysUser> selectUserList(SysUser user) { public List<SysUser> selectUserList(SysUser user) {
return baseMapper.selectUserList(user); return baseMapper.selectUserList(user);
} }