0

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

@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();
    }
}

方面工作良好,但最后一种方法executeWithFilter是在没有过滤的情况下完成的。同时,如果我添加@PostFilter(value = "hasPermission(filterObject, 'READ')")到常规服务方法中,过滤会起作用。甚至可以@PostFilter在方面使用吗?

4

1 回答 1

1

Spring Method Security是基于 AOP 的。

此外,来自 Spring AOP 参考文档:Declaring an Aspect

在 Spring AOP 中,切面本身不能成为其他切面通知的目标。类上的 @Aspect 注释将其标记为方面,因此将其排除在自动代理之外。

安全建议应该应用于提供@PostFilter方法安全性的 bean,这在一个方面是不可能的。简而言之,Spring 安全性不会在某个方面起作用。

于 2021-01-22T05:43:46.553 回答