package com.ard.framework.aspectj; import com.ard.common.annotation.DataScopePlus; import com.ard.common.constant.UserConstants; import com.ard.common.core.domain.entity.SysRole; import com.ard.common.core.domain.entity.SysUser; import com.ard.common.core.domain.model.LoginUser; import com.ard.common.core.text.Convert; import com.ard.common.utils.SecurityUtils; import com.ard.common.utils.StringUtils; import com.ard.framework.security.context.PermissionContextHolder; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @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 conditions = new ArrayList<>(); List 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; } }