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<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;
|
}
|
}
|