@PostFilter 不适用于 Spring @Aspect

问题描述

我正在尝试做这样的事情:

@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 安全性在某个方面不起作用。