70 lines
2.6 KiB
Java
70 lines
2.6 KiB
Java
package com.yupi.springbootinit.aop;
|
|
|
|
import com.yupi.springbootinit.annotation.AuthCheck;
|
|
import com.yupi.springbootinit.common.ErrorCode;
|
|
import com.yupi.springbootinit.exception.BusinessException;
|
|
import com.yupi.springbootinit.model.entity.User;
|
|
import com.yupi.springbootinit.model.enums.UserRoleEnum;
|
|
import com.yupi.springbootinit.service.UserService;
|
|
import javax.annotation.Resource;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.aspectj.lang.ProceedingJoinPoint;
|
|
import org.aspectj.lang.annotation.Around;
|
|
import org.aspectj.lang.annotation.Aspect;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.web.context.request.RequestAttributes;
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
/**
|
|
* 权限校验 AOP
|
|
*
|
|
* @author <a href="https://github.com/liyupi">程序员鱼皮</a>
|
|
* @from <a href="https://yupi.icu">编程导航知识星球</a>
|
|
*/
|
|
@Aspect
|
|
@Component
|
|
public class AuthInterceptor {
|
|
|
|
@Resource
|
|
private UserService userService;
|
|
|
|
/**
|
|
* 执行拦截
|
|
*
|
|
* @param joinPoint
|
|
* @param authCheck
|
|
* @return
|
|
*/
|
|
@Around("@annotation(authCheck)")
|
|
public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
|
|
String mustRole = authCheck.mustRole();
|
|
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
|
|
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
|
|
// 当前登录用户
|
|
User loginUser = userService.getLoginUser(request);
|
|
// 必须有该权限才通过
|
|
if (StringUtils.isNotBlank(mustRole)) {
|
|
UserRoleEnum mustUserRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
|
|
if (mustUserRoleEnum == null) {
|
|
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
|
}
|
|
String userRole = loginUser.getUserRole();
|
|
// 如果被封号,直接拒绝
|
|
if (UserRoleEnum.BAN.equals(mustUserRoleEnum)) {
|
|
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
|
}
|
|
// 必须有管理员权限
|
|
if (UserRoleEnum.ADMIN.equals(mustUserRoleEnum)) {
|
|
if (!mustRole.equals(userRole)) {
|
|
throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
|
|
}
|
|
}
|
|
}
|
|
// 通过权限校验,放行
|
|
return joinPoint.proceed();
|
|
}
|
|
}
|
|
|