Files
yjearth/src/main/java/com/yj/earth/aspect/RoleAccessAspect.java

79 lines
2.4 KiB
Java
Raw Normal View History

2025-09-08 17:01:50 +08:00
package com.yj.earth.aspect;
import cn.dev33.satoken.stp.StpUtil;
import com.yj.earth.annotation.RoleAccess;
import com.yj.earth.business.domain.User;
import com.yj.earth.business.domain.Role;
import com.yj.earth.business.service.UserService;
import com.yj.earth.business.service.RoleService;
import com.yj.earth.common.util.ApiResponse;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Method;
/**
* 角色访问控制切面
*/
@Aspect
@Component
public class RoleAccessAspect {
@Resource
private UserService userService;
@Resource
private RoleService roleService;
/**
* 环绕通知验证角色权限
*/
@Around("@annotation(com.yj.earth.annotation.RoleAccess)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取当前登录用户ID
if (!StpUtil.isLogin()) {
return ApiResponse.failure("请先登录");
}
String userId = StpUtil.getLoginIdAsString();
// 获取用户信息
User user = userService.getById(userId);
if (user == null) {
return ApiResponse.failure("用户不存在");
}
// 获取用户角色信息
Role role = roleService.getById(user.getRoleId());
if (role == null) {
return ApiResponse.failure("用户角色不存在");
}
// 获取注解信息
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
RoleAccess roleAccess = method.getAnnotation(RoleAccess.class);
String[] allowedRoles = roleAccess.roleNames();
// 验证角色是否有权限
boolean hasPermission = false;
for (String roleName : allowedRoles) {
if (roleName.equals(role.getRoleName())) {
hasPermission = true;
break;
}
}
if (!hasPermission) {
return ApiResponse.failure("没有访问权限、需要角色: " + String.join(",", allowedRoles));
}
// 有权限、执行原方法
return joinPoint.proceed();
}
}