| | |
| | | @Aspect |
| | | @Component |
| | | public class DataScopePlusAspect { |
| | | /** |
| | | * 全部数据权限 |
| | | */ |
| | | public static final String DATA_SCOPE_ALL = "1"; |
| | | |
| | | /** |
| | | * 自定数据权限 |
| | | */ |
| | | public static final String DATA_SCOPE_CUSTOM = "2"; |
| | | |
| | | /** |
| | | * 部门数据权限 |
| | | */ |
| | | public static final String DATA_SCOPE_DEPT = "3"; |
| | | |
| | | /** |
| | | * 部门及以下数据权限 |
| | | */ |
| | | public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; |
| | | |
| | | /** |
| | | * 仅本人数据权限 |
| | | */ |
| | | public static final String DATA_SCOPE_SELF = "5"; |
| | | |
| | | |
| | | @Pointcut("@annotation(com.ard.common.annotation.DataScopePlus)") |
| | | public void dataScopePointcut() { |
| | | } |
| | | |
| | | @Before("@annotation(controllerDataScopePlus)") |
| | | public void doBefore(JoinPoint joinPoint, DataScopePlus controllerDataScopePlus) { |
| | | handleDataScope(joinPoint, controllerDataScopePlus); |
| | | } |
| | | |
| | | protected void handleDataScope(final JoinPoint joinPoint, DataScopePlus controllerDataScope) { |
| | | // 获取当前用户 |
| | | LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | if (StringUtils.isNotNull(loginUser)) { |
| | | SysUser currentUser = loginUser.getUser(); |
| | | if (currentUser != null && !currentUser.isAdmin()) { |
| | | String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), |
| | | PermissionContextHolder.getContext()); |
| | | dataScopeFilter(joinPoint, currentUser, permission); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void dataScopeFilter(JoinPoint joinPoint, SysUser user, String permission) { |
| | | StringBuilder sqlString = new StringBuilder(); |
| | | List<String> conditions = new ArrayList<>(); |
| | | List<String> scopeCustomIds = new ArrayList<>(); |
| | | |
| | | // 获取用户角色并遍历进行权限检查 |
| | | user.getRoles().forEach(role -> { |
| | | if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(), |
| | | UserConstants.ROLE_NORMAL)) { |
| | | if (StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { |
| | | scopeCustomIds.add(Convert.toStr(role.getRoleId())); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | for (SysRole role : user.getRoles()) { |
| | | String dataScope = role.getDataScope(); |
| | | if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE)) { |
| | | continue; |
| | | } |
| | | |
| | | if (!StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { |
| | | continue; |
| | | } |
| | | |
| | | if (DATA_SCOPE_ALL.equals(dataScope)) { |
| | | sqlString = new StringBuilder(); |
| | | conditions.add(dataScope); |
| | | break; |
| | | } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { |
| | | // 自定义数据权限 |
| | | if (scopeCustomIds.size() > 1) { |
| | | sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " + |
| | | "role_id IN ({}) )", String.join(",", scopeCustomIds))); |
| | | } else { |
| | | sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " + |
| | | "role_id = {} )", role.getRoleId())); |
| | | } |
| | | } else if (DATA_SCOPE_DEPT.equals(dataScope)) { |
| | | // 部门数据权限 |
| | | sqlString.append(StringUtils.format(" OR dept_id = {}", user.getDeptId())); |
| | | } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { |
| | | // 部门及以下数据权限 |
| | | sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = {} " + |
| | | "OR find_in_set({}, ancestors))", user.getDeptId(), user.getDeptId())); |
| | | } else if (DATA_SCOPE_SELF.equals(dataScope)) { |
| | | // 仅本人数据权限 |
| | | sqlString.append(StringUtils.format(" OR user_id = {}", user.getUserId())); |
| | | } |
| | | conditions.add(dataScope); |
| | | } |
| | | QueryWrapper<?> queryWrapper = getQueryWrapper(joinPoint); |
| | | if (StringUtils.isNotBlank(sqlString.toString())) { |
| | | queryWrapper.apply(sqlString.substring(4)); |
| | | } |
| | | } |
| | | |
| | | private QueryWrapper<?> getQueryWrapper(JoinPoint joinPoint) { |
| | | Object[] args = joinPoint.getArgs(); |
| | | if (args != null && args.length > 0 && args[0] instanceof QueryWrapper) { |
| | | return (QueryWrapper<?>) args[0]; |
| | | } |
| | | return null; |
| | | } |
| | | // /** |
| | | // * 全部数据权限 |
| | | // */ |
| | | // public static final String DATA_SCOPE_ALL = "1"; |
| | | // |
| | | // /** |
| | | // * 自定数据权限 |
| | | // */ |
| | | // public static final String DATA_SCOPE_CUSTOM = "2"; |
| | | // |
| | | // /** |
| | | // * 部门数据权限 |
| | | // */ |
| | | // public static final String DATA_SCOPE_DEPT = "3"; |
| | | // |
| | | // /** |
| | | // * 部门及以下数据权限 |
| | | // */ |
| | | // public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; |
| | | // |
| | | // /** |
| | | // * 仅本人数据权限 |
| | | // */ |
| | | // public static final String DATA_SCOPE_SELF = "5"; |
| | | // |
| | | // |
| | | // @Pointcut("@annotation(com.ard.common.annotation.DataScopePlus)") |
| | | // public void dataScopePointcut() { |
| | | // } |
| | | // |
| | | // @Before("@annotation(controllerDataScopePlus)") |
| | | // public void doBefore(JoinPoint joinPoint, DataScopePlus controllerDataScopePlus) { |
| | | // handleDataScope(joinPoint, controllerDataScopePlus); |
| | | // } |
| | | // |
| | | // protected void handleDataScope(final JoinPoint joinPoint, DataScopePlus controllerDataScope) { |
| | | // // 获取当前用户 |
| | | // LoginUser loginUser = SecurityUtils.getLoginUser(); |
| | | // if (StringUtils.isNotNull(loginUser)) { |
| | | // SysUser currentUser = loginUser.getUser(); |
| | | // if (currentUser != null && !currentUser.isAdmin()) { |
| | | // String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), |
| | | // PermissionContextHolder.getContext()); |
| | | // dataScopeFilter(joinPoint, currentUser, permission); |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // private void dataScopeFilter(JoinPoint joinPoint, SysUser user, String permission) { |
| | | // StringBuilder sqlString = new StringBuilder(); |
| | | // List<String> conditions = new ArrayList<>(); |
| | | // List<String> scopeCustomIds = new ArrayList<>(); |
| | | // |
| | | // // 获取用户角色并遍历进行权限检查 |
| | | // user.getRoles().forEach(role -> { |
| | | // if (DATA_SCOPE_CUSTOM.equals(role.getDataScope()) && StringUtils.equals(role.getStatus(), |
| | | // UserConstants.ROLE_NORMAL)) { |
| | | // if (StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { |
| | | // scopeCustomIds.add(Convert.toStr(role.getRoleId())); |
| | | // } |
| | | // } |
| | | // }); |
| | | // |
| | | // for (SysRole role : user.getRoles()) { |
| | | // String dataScope = role.getDataScope(); |
| | | // if (conditions.contains(dataScope) || StringUtils.equals(role.getStatus(), UserConstants.ROLE_DISABLE)) { |
| | | // continue; |
| | | // } |
| | | // |
| | | // if (!StringUtils.containsAny(role.getPermissions(), Convert.toStrArray(permission))) { |
| | | // continue; |
| | | // } |
| | | // |
| | | // if (DATA_SCOPE_ALL.equals(dataScope)) { |
| | | // sqlString = new StringBuilder(); |
| | | // conditions.add(dataScope); |
| | | // break; |
| | | // } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { |
| | | // // 自定义数据权限 |
| | | // if (scopeCustomIds.size() > 1) { |
| | | // sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " + |
| | | // "role_id IN ({}) )", String.join(",", scopeCustomIds))); |
| | | // } else { |
| | | // sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_role_dept WHERE " + |
| | | // "role_id = {} )", role.getRoleId())); |
| | | // } |
| | | // } else if (DATA_SCOPE_DEPT.equals(dataScope)) { |
| | | // // 部门数据权限 |
| | | // sqlString.append(StringUtils.format(" OR dept_id = {}", user.getDeptId())); |
| | | // } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { |
| | | // // 部门及以下数据权限 |
| | | // sqlString.append(StringUtils.format(" OR dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = {} " + |
| | | // "OR find_in_set({}, ancestors))", user.getDeptId(), user.getDeptId())); |
| | | // } else if (DATA_SCOPE_SELF.equals(dataScope)) { |
| | | // // 仅本人数据权限 |
| | | // sqlString.append(StringUtils.format(" OR user_id = {}", user.getUserId())); |
| | | // } |
| | | // conditions.add(dataScope); |
| | | // } |
| | | // QueryWrapper<?> queryWrapper = getQueryWrapper(joinPoint); |
| | | // if (StringUtils.isNotBlank(sqlString.toString())) { |
| | | // queryWrapper.apply(sqlString.substring(4)); |
| | | // } |
| | | // } |
| | | // |
| | | // private QueryWrapper<?> getQueryWrapper(JoinPoint joinPoint) { |
| | | // Object[] args = joinPoint.getArgs(); |
| | | // if (args != null && args.length > 0 && args[0] instanceof QueryWrapper) { |
| | | // return (QueryWrapper<?>) args[0]; |
| | | // } |
| | | // return null; |
| | | // } |
| | | } |