2012-01-09 64 views
1

我正在用一些RESTfull資源作爲API製作Spring MVC Web應用程序。SpringSecurity多個名稱空間和安全註釋。非常混亂

我需要的問題的REST部分有一些自定義過濾器,因爲我不希望有任何重定向,我想任何異常與相應的HTTP錯誤代碼和一個基本的JSON說明翻譯做。

在另一方面,網站的其他部分必須是較常見的和重定向人時沒有登錄的情況等

還有一兩件事,我想用@Secured批註和後在某些情況下的認證。

我如何正確定義(春3.1)的多個HTTP命名空間?

這裏是我的錯誤配置:

<global-method-security secured-annotations="enabled" /> 

<http pattern="/rest/**" authentication-manager-ref="authenticationManager" entry-point-ref="restAuthenticationEntryPoint"> 
    <form-login login-page="/rest/login" login-processing-url="/rest/postlogin" 
     authentication-success-handler-ref="restAuthenticationSuccessHandler" 
     authentication-failure-handler-ref="restAuthenticationFailureHandler" 
     username-parameter="username" password-parameter="password" /> 
    <logout logout-url="/rest/logout" invalidate-session="true" /> 
</http> 

<http pattern="/**" authentication-manager-ref="authenticationManager"> 
    <form-login login-page="/login" login-processing-url="/postlogin" 
     username-parameter="username" password-parameter="password" /> 
    <logout /> 
</http> 

有趣的是,這種配置工作的一部分,我可以用/ REST /登錄密碼,我從我的自定義成功處理程序的響應。我也可以登錄/登錄,我得到適當的重定向到/。註銷也很好。

接着,所有控制器豆已在安全方法@Secured( 「ROLE_USER」)。但是所有的安全方法都不能得到保證。這是爲什麼呢?

@Secured({"ROLE_USER"}) 
@RequestMapping(method = RequestMethod.GET, headers = { "Range" }) 
public @ResponseBody 
HttpEntity<List<T>> list(@RequestHeader("Range") String range) { 

我已經閱讀過文件,我比以前更困惑。

  • 爲什麼我的方法不被固定?
  • 必須在HTTP命名空間定義的訪問,以便@Secured註釋工作?
  • http命名空間是否覆蓋我的@Secured註釋?如果是這樣,我怎樣才能定義多個「登錄頁面」與自定義過濾器,並能夠使用註釋?

這裏有一些事實: *我使用Spring和SpringSecurity 3.1 *我有一個自定義的AuthenticationManager檢索從休眠的daos用戶詳細信息。 *有些控制器正在擴展@Secured註釋所在的抽象類。但它仍然不適用於簡單的控制器。 *我的控制器是通過上下文發現的:component-scan和base-package。 *安全性可以在一個http命名空間下正常工作。

請幫助,我惹毛了這個!

回答

0

檢查出this answer關於確保web上下文對global-method-security聲明可見並可能使用類代理。

爲了回答您的其他問題,沒有http命名空間應該不影響使用的@Secured註釋,比用戶通過應用程序的Web部件驗證,這些信息將通過方法安全性攔截時可以使用其他作出訪問決定。除非您覆蓋它(使用access-decision-manager-ref),否則方法安全性將使用標準AccessDecisionManager,該標準根據用戶具有的角色授予或拒絕訪問。

+0

非常感謝!問題在於調度程序servlet上下文和主要上下文是不同的,因此安全註釋沒有在必要的地方啓用。現在我已經在我的servlet上下文中添加了全局安全註釋,並且一切正常!這裏是[Faq](http://static.springsource.org/spring-security/site/faq/faq.html#faq-method-security-in-web-context)。 – adreide 2012-01-10 07:18:16