2011-12-29 96 views
2

我有一個我的web應用程序的一部分,它是一個RESTfull api,並且是更標準的web頁面的一部分。Spring Security多個filterChainProxy映射/過濾器,自定義過濾器Json輸出

我希望有一些自定義過濾器,如入口點,SuccessHandler和FailureHandler剩餘部分。這部分位於/ rest/**映射中。

在另一方面,其他的一切都需要有更多的共同的過濾器和映射與/ **。

的問題是要找到一種簡單的方法有不同的對應過濾器定義的FilterChainProxy。

眼下這個解決方案不起作用:

<!-- Normal web app --> 
<http auto-config="true" use-expressions="true" authentication-manager-ref="authenticationManager"> 
    <form-login/> 
    <logout/> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
</http> 

<!-- Configure RESTfull services --> 
<http use-expressions="true" authentication-manager-ref="authenticationManager" entry-point-ref="restAuthenticationEntryPoint" > 
    <form-login authentication-success-handler-ref="restAuthenticationSuccessHandler" login-page="/rest/login" username-parameter="username" password-parameter="password" /> 
    <logout logout-url="/rest/logout" /> 
    <intercept-url pattern="/rest/**" method="GET" access="hasRole('ROLE_USER')" /> 
    <intercept-url pattern="/rest/**" method="POST" access="hasRole('ROLE_ADMIN')" /> 
    <intercept-url pattern="/rest/**" method="PUT" access="hasRole('ROLE_ADMIN')" /> 
    <intercept-url pattern="/rest/**" method="DELETE" access="hasRole('ROLE_ADMIN')" /> 
</http> 

它抱怨附:univseral比賽是先於其他模式。

有沒有一種方法來定義這樣的事情,而不訴諸與定義界定的FilterChainProxy? http版本的確幫助了很多,以減少配置的數量,因爲我將不得不手動設置一個UsernamePasswordAuthenticationFilter等。

下一個問題更簡單:我必須在使用表單登錄身份驗證JSON對象。

到目前爲止,我已經實現了SuccessHandler(實際上是一個版本SimpleUrlAuthenticationSuccessHandler沒有重定向的部分)。

如何編寫我的JSON輸出?

我必須有這樣的事情:

HTTP 200 OK 

有:

{"success":true,"customer {"email":"[email protected]","session_id":"b83a41dfaca6785399f00837888886e646ff9088"}} 

,並與FailureHandler類似的事情。它一定很簡單,它肯定是一些非常基本的東西,但你怎麼做?重定向到自定義控制器不是解決方案,因爲我將擁有301重定向狀態,這是一個非常簡單的REST客戶端可能無法理解的狀態。

至少,我希望只有http頭和沒有身體。

謝謝!

+0

將2個driffrent接口(WWW和REST)放在一個ApplicationContext中的原因是什麼?兩者之間是否有一些背景/會話共享?是否登錄到WWW也意味着登錄到REST?如果是這樣,那麼爲什麼分開登錄操作?如果不是,那爲什麼把它們放在一起?難道這些不是單獨的應用程序爲單個底層服務層提供不同的接口嗎? – Roadrunner 2011-12-29 19:50:46

+0

這就像在正常的Web應用程序內部有一個REST部分。我不想要另一個身份驗證過程,我只想要其他過濾器。 REST部分只是在沒有身份驗證時顯示錯誤,但另一方面,在網頁上我必須將用戶重定向到登錄頁面。 – adreide 2011-12-30 07:35:50

回答

1

如果你可以升級到Spring Security的3.1它supports multiple chains using namespace configuration

+0

謝謝,更新到3.1訣竅! http://static.springsource.org/spring-security/site/docs/3.1.x/reference/security-filter-chain.html#filter-chains-with-ns瞭解更多信息。我不得不使用http命名空間中的模式屬性。 – adreide 2011-12-30 07:43:52