自定义切面使用:
注解类:
package com.xx.datamanage.controller.aop;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserPermission {
@AliasFor("rbacToken")
String value() default "";
}
aop切面类
package com.xx.datamanage.controller.aop;
import com.xx.common.bean.base.LoginInfo;
import com.xx.common.service.FyRedisManage;
import com.xx.datamanage.exception.BusinessException;
import com.xx.datamanage.mapper.AuthorMapper;
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.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.expression.AnnotatedElementKey;
import org.springframework.expression.EvaluationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Objects;
@Aspect
@Component
public class UserPermissionAop {
private static Logger log = LoggerFactory.getLogger(UserPermissionAop.class);
private static final ExpressionEvaluator<String> EVALUATOR = new ExpressionEvaluator<>();
@Resource
private AuthorMapper authorMapper;
@Resource
private FyRedisManage fyRedisManage;
@Pointcut(value = "@annotation(permission)", argNames = "permission")
public void pointcut(com.fy.datamanage.controller.aop.UserPermission permission) {
}
@Around(value = "pointcut(permission)", argNames = "joinPoint,permission")
public Object around(ProceedingJoinPoint joinPoint, UserPermission permission) throws Throwable {
String rbacToken = "";
String permissionValue = permission.value();
if (StringUtils.isNotBlank(permissionValue)) {
rbacToken = this.evalLockParam(joinPoint, permissionValue);
}
if (StringUtils.isBlank(rbacToken)) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
rbacToken = request.getParameter("rbacToken");
}
if (StringUtils.isBlank(rbacToken)) {
throw new BusinessException("请传入用户token", 1001);
}
LoginInfo loginInfo = fyRedisManage.getLoginInfo(rbacToken);
if (Objects.isNull(loginInfo) || StringUtils.isBlank(loginInfo.getUserId())) {
throw new BusinessException("当前用户不存在", 1002);
}
String roleId = authorMapper.getRoleIdByUserId(loginInfo.getUserId());
if (StringUtils.isBlank(roleId) || roleId.equals("role2")) {
log.info("当前用户无此权限");
throw new BusinessException("当前用户无权限", 1003);
}
return joinPoint.proceed();
}
private String evalLockParam(ProceedingJoinPoint point, String lockParam) {
MethodSignature ms = (MethodSignature) point.getSignature();
Method method = ms.getMethod();
Object[] args = point.getArgs();
Object target = point.getTarget();
Class<?> targetClass = target.getClass();
EvaluationContext context = EVALUATOR.createEvaluationContext(target, target.getClass(), method, args);
AnnotatedElementKey elementKey = new AnnotatedElementKey(method, targetClass);
return EVALUATOR.condition(lockParam, elementKey, context, String.class);
}
}
使用注解
@UserPermission
@GetMapping("/page")
public BaseResponse page(PageRequest page){
return ResponseUtil.success(this.service.getPage(page));
}
@UserPermission("#dto.rbacToken")
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public BaseResponseVO addUser(@RequestBody UserAddDTO dto) {
this.service.addUser(dto);
return ResponseVOUtil.success("新增成功");
}