2016-05-04 25 views
2

我有一个关于Spring机制的问题。这里是方案:为什么@Resource不能与@PreAuthorize配合使用

我有一个抽象的控制器类,有一些依赖注入@Resource注释。子类包含用于处理请求的@RequestMapping注释。直到现在一切正常,所有依赖关系都被注入了。

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

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

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

回答

0

如果要使用preauthorize批注,那么最好的部分是在服务层中使用它们而不是在控制器中。 这也记录在这里http://docs.spring.io/spring-security/site/docs/3.2.x/reference/htmlsingle/faq.html#faq-method-security-in-web-context “一般来说,我们会建议在业务层应用方法的安全性,而不是对个人的网络控制器”

如果你想保护的URL(即requestmapping在控制器中定义),最好的方法是使用拦截的URL模式在此URL描述 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

要使用预授权和JSR-250注解,你必须

  • 注释你春季安全配置类: @EnableGlobalMethodSecurity(prePostEnabled = TRUE,jsr250Enabled = TRUE)
  • ,如果你在应用程序中使用Spring其他地方使用JDK代理的AOP使所有想要使用方法安全性的控制器类实现声明所有受保护方法的接口
  • 如果您在应用程序中的任何其他位置使用Spring AOP和CGLIB代理,请将proxyTargetClass = true添加到@EnableGlobalMethodSecurity: @ EnableGlobalMethodSecurity(prePostEnabled = true,jsr250Enabl如果你想在3.2版本的Spring版本中使用CGLIB代理,将CGLIB库添加到你的类路径中(CGLIB类包含在Spring 3.2+中) 避免混合使用CGLIB和JDK代理Spring文档不建议:在运行时将多个部分合并为一个统一的自动代理创建器,该应用程序应用任何部分(通常来自不同的XML bean定义文件)指定的最强代理设置。这也适用于和元素。清楚的是:使用'proxy-target-class =“true”',或者元素将强制使用CGLIB代理对其中的三个代理。

希望这会有帮助

相关问题