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 5.2.1.RELEASE(所有软件包)。
结果证明我实际上非常亲密,通过进行少量更新并更改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
.gradle
和1.9.4
是我当前的设置/版本的大小写。请注意,例如,这尚未经过测试(但可与JPA / Hibernate一起使用)交易管理,一旦开始使用复杂的交易(编织会产生问题),我将对此进行评论。