【问题标题】:@PostFilter does not work with Spring @Aspect@PostFilter 不适用于 Spring @Aspect
【发布时间】:2021-04-26 10:36:44
【问题描述】:

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

@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吗?

【问题讨论】:

    标签: java spring-security spring-aop spring-security-acl


    【解决方案1】:

    Spring Method Security 是基于 AOP 的。

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

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

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

    【讨论】:

    • 感谢您的回答!可能必须实现自定义权限检查。
    • 我只是注意到知道你做“单词,单词”是故意有趣的
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多