1. 首先先写一个注解
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RequirePermission {
PermissionCode[] value();
}
2.在需要权限控制的方法上加上注解
@PostMapping("/add")
@RequirePermission(PermissionCode.SANCUS_ADMIN)
public Result<Long> add(@RequestBody MarketingRules marketingRules) {
OneLogUtil.createLog(LOG_ITEM_NAME, JSON.toJSONString(marketingRules));
return RESULT_PROVIDER.getResult(marketingRulesManager.add(marketingRules));
}
3. 写一个切面类
@Aspect
@Component
@Slf4j
public class PermissonAspect {
@Autowired
protected HttpServletRequest request;
@Autowired
private PermissionManager permissionManager;
private static final ResultProvider RESULT_PROVIDER = ResultProvider.init(ModuleCode.NOT_USE);
@Pointcut("@annotation(com.taobao.datasecurity.annotation.RequirePermission)")
public void pointCut() {
}
@Around("pointCut()")
public Object exceptionHandler(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
RequirePermission requirePermission = signature.getMethod().getAnnotation(RequirePermission.class);
boolean requireAdmin = Arrays.stream(requirePermission.value()).anyMatch(it -> it.equals(PermissionCode.SANCUS_ADMIN));
User currentUser = BucUserUtil.getCurrentUser(request);
Boolean sancusAdmin = permissionManager.isSancusAdmin(currentUser);
if (requireAdmin && sancusAdmin) {
return joinPoint.proceed();
}
return RESULT_PROVIDER.getResult(UNAUTHORIZED);
}
}