2016-05-04 64 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代理對其中的三個代理。

希望這會有幫助

相關問題