为Spring方法安全性启用编译时AspecJ

问题描述 投票:1回答:1

Spring AOP通过代理运行所有内容,但遗憾的是,无处不在。因此,当呼叫不通过代理时,将不考虑Spring Security的注释@PreAuthorize@PostAuthorize@PreFilter@PostFilter(也包括@Secured)。代理仅针对单例(@Bean)创建,因此当我们要保护非bean的特定对象(例如JPA @Entities)上的方法时,我们受到很大的限制。代理也不会在调用对象内被调用(bean在self上下文中调用其方法-此)。

我知道Spring不仅为Spring AOP提供支持,而且为真正的AOP提供支持-AspectJ。不仅如此,它还应该支持AspectJ 开箱即用。对此的证明是:

@EnableGlobalMethodSecurity(mode = AdviceMode.ASPECTJ, securedEnabled = true, prePostEnabled = true)

启用后,Spring将要求(在启动时崩溃)aspectj依赖关系,该依赖关系在以下位置提供:

'org.springframework.security:spring-security-aspects'

添加此依赖项后,我们将在类路径中具有AspectJ库,并将获得:

org.springframework.security.access.intercept.aspectj.aspect

with:

public aspect AnnotationSecurityAspect implements InitializingBean

但是到此为止。我找不到可以说明如何进一步启用Aspectj编织的文档。当我们丢失标准的Spring AOP时,将@EnableGlobalMethodSecurity(mode = AdviceMode.ASPECTJ)设置为[[肯定有某事-安全注释停止在任何地方(在Beans上)工作,并且同时不被AspectJ编织。

任何人都对Spring对此开箱即用(编译时编织)的支持有一些了解,还需要进一步配置吗?也许我需要自己编织一下?我需要一些特定的库来构建吗?

版本:Spring 5.2.1.RELEASE(所有软件包)。

spring spring-security aop aspect
1个回答
1
投票
@@ DimaSan评论帮助我找到了一些在搜索时错过的主题/问题,尽管其中许多主题已经过时了,但我还是设法设置了我的应用程序。

结果证明我实际上非常亲密,通过进行少量更新并更改gradle上的依赖项/插件,我得到了一个工作环境。

Gradle: 5.6.4

with:

plugins { id "io.freefair.aspectj.post-compile-weaving" version "4.1.6" } dependencies { aspect 'org.springframework.security:spring-security-aspects' runtime 'org.springframework.security:spring-security-aspects' }

5.2.1.RELEASE处的弹簧设置与

spring-boot-starter- web data-jpa security

使用上面的设置,这实际上只是需要做的事情:

@EnableGlobalMethodSecurity(mode = AdviceMode.ASPECTJ, securedEnabled = true, prePostEnabled = true)

最后,如果您不使用Gradle(例如,要使用STS / Eclipse运行配置,则将添加:

-javaagent:C:\Users\USER\.gradle\caches\modules-2\files-2.1\org.aspectj\aspectjweaver\1.9.4\<cache-string>\aspectjweaver-1.9.4.jar

.gradle1.9.4是我当前的设置/版本的大小写。

请注意,例如,这尚未经过测试(但可与JPA / Hibernate一起使用)交易管理,一旦开始使用复杂的交易(编织会产生问题),我将对此进行评论。

© www.soinside.com 2019 - 2024. All rights reserved.