问题描述
我正在尝试做这样的事情:
@Component
@Aspect
class CustomAspect {
@pointcut("within(@com.example.security.Check *)")
public void classAnnotatedWithCheck() {}
@pointcut("execution(public * *(..))")
public void publicmethod() {}
@pointcut("publicmethod() && classAnnotatedWithCheck()")
public void publicmethodInsideAClassMarkedWithCheck() {}
@Around(value = "publicmethodInsideAClassMarkedWithCheck()")
public Object execute(ProceedingJoinPoint point) throws Throwable {
return executeWithFilter(point);
}
@PostFilter(value = "hasPermission(filterObject,'READ')")
private Object executeWithFilter(ProceedingJoinPoint point) throws Throwable {
return point.proceed();
}
}
Aspects 运行良好,但最后一个方法 executeWithFilter
没有过滤就完成了。同时,如果我将 @PostFilter(value = "hasPermission(filterObject,'READ')")
添加到常规服务方法中,过滤会起作用。甚至可以在方面使用 @PostFilter
吗?
解决方法
Spring Method Security 是基于 AOP 的。
此外,来自 Spring AOP 参考文档:Declaring an Aspect
在 Spring AOP 中,方面本身不能成为来自 其他方面。类上的@Aspect 注释将其标记为一个方面 因此,将其排除在自动代理之外。
安全建议应该应用于 bean 以提供 @PostFilter
方法 security ,这在一个方面是不可能的。简而言之,Spring 安全性在某个方面不起作用。