为什么@Resource不能与@PreAuthorize

时间:2016-05-04 12:25:46

标签: java spring spring-mvc dependency-injection

我对Spring机制有疑问。这是场景:

我有一个抽象的Controller类,它有一些由@Resource Annotation注入的依赖项。子类包含用于处理请求的@RequestMapping注释。到目前为止,一切工作正常,所有依赖都被注入。

现在我正在尝试将Spring Security引入我们的项目,但是当我尝试使用@PreAuthorize时,我在某些NullPointerException方法中得到@ModelAttribute,因为依赖注入现在失败了。我发现,Spring是我的Controller的代理类,但不知何故不会注入所有依赖项。

也许我错过了一个配置来告诉Spring代理必须使用目标的依赖关系,或者它应该将所有依赖关系注入代理本身。

如果有人有想法,我会很高兴听到它。

1 个答案:

答案 0 :(得分:0)

如果您想使用预授权注释,那么最好的部分是在服务层中使用它们而不是在控制器中。 这也记录在这里http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/faq.html#faq-method-security-in-web-context “通常我们建议在服务层而不是在单个Web控制器上应用方法安全性”

如果你想保护网址(即在控制器中定义的请求图片),最好的方法是使用此网址中描述的拦截网址模式 http://docs.spring.io/spring-security/site/docs/4.0.x/reference/html/core-web-filters.html#filter-security-interceptor

如果您仍想在控制器中使用预授权 您可以按照这些说明(此处已存在Securing controller method with @RolesAllowed and @PreAuthorize

进行操作

要使用PreAuthorize和JSR-250注释,您必须

  • 使用以下命令为spring 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库添加到类路径中(CGLIB类包含在Spring 3.2+中) 避免混合使用CGLIB和JDK代理,因为Spring文档不推荐这样做:在运行时将多个部分折叠成一个统一的自动代理创建器,它应用任何部分(通常来自不同的XML bean定义文件)的最强代理设置指定。这也适用于和元素。要明确:使用'proxy-target-class =“true”',或者元素将强制使用CGLIB代理来处理所有这三个代理。

希望这有帮助