您描述的症状使我想到了代理问题。注释在服务层上运行良好,因为服务通常实现接口,并且Spring可以轻松地使用JDK代理来放置AOP授权。
但是控制器通常不实现接口。这就是为什么在服务层中更频繁地使用PreAuthorize批注的原因。恕我直言,您最好尝试使用基于URL模式的授权,而不是控制器上的PreAuthorize批注。另一种选择是将目标类代理与CGLIB一起使用。
要使用
PreAuthorize和JSR-250批注,您必须
使用以下注释为spring安全配置类添加注释:
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
如果您在应用程序的其他任何地方使用带有JDK代理的Spring AOP,请在要使用方法安全性实现接口的所有控制器类中声明所有受保护的方法
如果您在带有CGLIB代理的应用程序Spring AOP中使用其他任何地方,请添加
proxyTargetClass = true
到@EnableGlobalMethodSecurity
:@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true, proxyTargetClass = true)
如果要在3.2版以下的Spring版本中使用CGLIB代理,请将CGLIB库添加到类路径(Spring 3.2+中包含CGLIB类)
避免混合使用CGLIB和JDK代理,因为Spring文档不建议这样做: 在运行时将多个部分折叠到一个统一的自动代理创建器中,该创建器将应用任何部分中最强的代理设置(通常来自不同的XML bean定义文件)指定。 这也适用于和元素。 需要明确的是:在或元素上使用’proxy-target-class =“ true”’会强制对所有三个元素使用CGLIB代理。
但是无论如何,我的建议是尝试将方法安全性转移到通常已经支持AOP的服务层。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)