Spring security 具有@EnableGlobalMethodSecurity的Spring安全AspectJMode不工作

Spring security 具有@EnableGlobalMethodSecurity的Spring安全AspectJMode不工作,spring-security,aspectj,Spring Security,Aspectj,我正在尝试使用SpringSecurity4.0.0.M1从XML配置迁移到JavaConfig 这是我的配置,它可以工作: @配置 @ImportResource(“类路径:applicationContext security.xml”) 公共类MethodSecurityXmlConfig {} 和applicationContext-security.xml 我有这样的服务方法: @Transactional(readOnly=false) @预授权(“hasPermission(

我正在尝试使用SpringSecurity4.0.0.M1从XML配置迁移到JavaConfig

这是我的配置,它可以工作:

@配置
@ImportResource(“类路径:applicationContext security.xml”)
公共类MethodSecurityXmlConfig
{}
和applicationContext-security.xml


我有这样的服务方法:

@Transactional(readOnly=false)
@预授权(“hasPermission(#form,'idForm'))
公共布尔运行操作(IdForm表单,错误)引发异常{…}
此外,我还有这样一个方面排序建议,因为我的PermissionEvaluator也需要一个事务。因此,
Transactional
应该在安全之前运行

公共方面AspectorOrdering
{
声明优先级:AnnotationTransactionSpect,*SecurityAspect;
}
我使用maven和spring安全方面进行编译时编织。如果我调试它,我可以看到
AspectJMethodSecurityInterceptor
正在这个方法上被调用(在事务..之后)。
所以,这很好用

现在我只从MethodSecurityXmlConfig切换到此配置类:

@配置
@EnableGlobalMethodSecurity(mode=AdviceMode.ASPECTJ,preprestenabled=true)
公共类方法SecurityConfig扩展了GlobalMethodSecurityConfiguration
{
@资源
私人授权授权评估人授权授权评估人;
@凌驾
受保护的MethodSecurityExpressionHandler createExpressionHandler()
{
DefaultMethodSecurityExpressionHandler DefaultMethodSecurityExpressionHandler=新的DefaultMethodSecurityExpressionHandler();
defaultMethodSecurityExpressionHandler.setPermissionEvaluator(delegatingPermissionEvaluator);
返回defaultMethodSecurityExpressionHandler;
}
}
方法调用仍然被Spring Security拦截,但它不使用AspectJ模式,而是使用AopProxy

由于没有使用AspectJ,我的排序无法工作,因此Spring安全性在@Transactional之前运行

调试时,我可以看到调用了
MethodSecurityInterceptor
,但看不到
AspectJMethodSecurityInterceptor
。仍然建议使用该方法,但AspectJMethodSecurityInterceptor可能永远不会被调用,因为未配置AnnotationSecurityAspect并调用return Procept(),因为它无权访问AspectJMethodSecurityInterceptor

对我来说,这似乎是一个错误。在提出问题之前,我想问:


我是否错过了一些配置来确保AspectJ工作时的方法安全性

该元素不连贯:

<security:global-method-security mode="aspectj" proxy-target-class="false" pre-post-annotations="enabled">

根据Spring安全参考手册/附录/安全命名空间/方法安全/:

  • mode=“aspectj”:可以将该属性设置为“aspectj”,以指定应使用aspectj而不是默认的Spring AOP
  • proxy target class=“false”:代理目标类如果为true,将使用基于类的代理,而不是基于接口的代理

您同时要求JDK代理和AspectJ模式。首先删除代理目标class=“false”,如果您还没有安装AspectJ编织机制,请安装它。

这是Spring Security 4.0.0.M1中的一个bug,请参见

是的,但是如果代理目标类设置为false是默认值,这并不重要。我不是在要求代理模式。我的aspectj CTW工作得很好。