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 程序员鱼皮 * @from 编程导航知识星球 */ @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(); } }