为 Spring 方法安全启用编译时 AspecJ
Enabling compile-time AspecJ for Spring Method Security
Spring AOP 通过代理来运行一切,遗憾的是代理不能无处不在。出于这个原因 Spring 安全的注释 @PreAuthorize
、@PostAuthorize
、@PreFilter
和 @PostFilter
(还有 @Secured
)在调用时不会被考虑不通过所述代理。代理仅为单例 (@Bean
s) 创建,因此当我们想要保护不是 beans 的特定对象(例如 JPA @Entities
)上的方法时,我们会受到很大限制。代理也不会在调用对象中被调用(bean 在 self - this 的上下文中调用它的方法)。
我知道 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
与:
public aspect AnnotationSecurityAspect implements InitializingBean
但这一切都结束了。我找不到说明如何进一步启用 aspectj 编织的文档。当我们失去标准 Spring AOP 时,设置 @EnableGlobalMethodSecurity(mode = AdviceMode.ASPECTJ)
肯定会做一些事情 - 安全注释在任何地方(在 Beans 上)都停止工作,同时它们不与 AspectJ 编织.
是否有人了解 Spring 对这种开箱即用(编译时织入)的支持以及需要什么进一步的配置?也许我需要自己编织?我需要一些特定的库来构建吗?
版本:Spring5.2.1.RELEASE(所有包)。
@DimaSan 评论帮助我找到了一些 threads/issues 我在搜索时遗漏了,虽然其中很多已经过时了,但我设法设置了我的应用程序。
事实证明我实际上非常接近并且通过在 gradle 上进行一些更新和更改 dependencies/plugins 我有一个工作环境。
Gradle: 5.6.4
与:
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'
}
Spring 在 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.9.4\<cache-string>\aspectjweaver-1.9.4.jar
.gradle
和 1.9.4
是我当前 setup/version.
的情况
请注意,这尚未经过测试(但可以使用 JPA/Hibernate),例如事务管理,一旦我开始使用编织会产生问题的复杂事务,我将对此发表评论。
Spring AOP 通过代理来运行一切,遗憾的是代理不能无处不在。出于这个原因 Spring 安全的注释 @PreAuthorize
、@PostAuthorize
、@PreFilter
和 @PostFilter
(还有 @Secured
)在调用时不会被考虑不通过所述代理。代理仅为单例 (@Bean
s) 创建,因此当我们想要保护不是 beans 的特定对象(例如 JPA @Entities
)上的方法时,我们会受到很大限制。代理也不会在调用对象中被调用(bean 在 self - this 的上下文中调用它的方法)。
我知道 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
与:
public aspect AnnotationSecurityAspect implements InitializingBean
但这一切都结束了。我找不到说明如何进一步启用 aspectj 编织的文档。当我们失去标准 Spring AOP 时,设置 @EnableGlobalMethodSecurity(mode = AdviceMode.ASPECTJ)
肯定会做一些事情 - 安全注释在任何地方(在 Beans 上)都停止工作,同时它们不与 AspectJ 编织.
是否有人了解 Spring 对这种开箱即用(编译时织入)的支持以及需要什么进一步的配置?也许我需要自己编织?我需要一些特定的库来构建吗?
版本:Spring5.2.1.RELEASE(所有包)。
@DimaSan 评论帮助我找到了一些 threads/issues 我在搜索时遗漏了,虽然其中很多已经过时了,但我设法设置了我的应用程序。
事实证明我实际上非常接近并且通过在 gradle 上进行一些更新和更改 dependencies/plugins 我有一个工作环境。
Gradle: 5.6.4
与:
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'
}
Spring 在 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.9.4\<cache-string>\aspectjweaver-1.9.4.jar
.gradle
和 1.9.4
是我当前 setup/version.
请注意,这尚未经过测试(但可以使用 JPA/Hibernate),例如事务管理,一旦我开始使用编织会产生问题的复杂事务,我将对此发表评论。