2012-02-20 53 views
1

我們有REST API的應用程序。它基於Spring,也使用Spring安全性。 例如,我們配置了一些基於角色的限制:如何使基於Spring的應用程序使用jsessionid URL參數工作

<sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager"> 
    <sec:intercept-url pattern="/auth/authenticate" access="IS_AUTHENTICATED_ANONYMOUSLY"/> 
    <sec:intercept-url pattern="/auth/logout" access="IS_AUTHENTICATED_FULLY"/> 
    <sec:intercept-url pattern="https://stackoverflow.com/users/**" access="USER"/> 
</sec:http>  

它正常工作與餅乾,但現在我們需要啓用的可能性,通過JSESSIONID作爲URL PARAM代替餅乾。我認爲我們不需要在我們的代碼中改變任何東西,但出現了一些問題。 我請求/登錄方法並從響應複製jsessionid。從那以後,我嘗試請求 /用戶; JSESSIONID = *並得到了401狀態碼,這意味着應用程序沒認出我。爲了使這種方法有效,我們應該改變什麼?

+0

如果您在瀏覽器中禁用Cookie,然後登錄會發生什麼? – Ralph 2012-02-20 12:08:02

+0

我得到了正確的JSON響應,例如{「result」:{「status」:「SUCCESS」,「message」:「Request Succeeded」,「timestamp」:1329740163355},「data」:{「email」:「user @ **。com「,」roles「:[」USER「]}}和標題來設置jsessionid cookies – Mikhail 2012-02-20 12:11:37

+0

讓我總結一下:JSessionID在瀏覽器中工作,但不在您的休息客戶端中? – Ralph 2012-02-20 12:12:44

回答

2

一般來說,Cookie,根據認證系統,不利於基於XML的API(如SOAP和REST)。練習是在每個API調用中進行身份驗證。

檢查this後在同一論壇。引用該帖子:

REST服務通常在每個請求上都得到認證, 通常不會被會話認證。現在

這種情況的原因是

  • 這些類型的XML的API基地的客戶或消費者不是瀏覽器,但其他應用程序。
  • 瀏覽器瞭解cookies,事實上cookie是針對基於瀏覽器的用戶而不是一般的應用程序。
  • 客戶可能會或可能不會理解cookie並在大多數情況下不會明白餅乾不是認證這些類型的API的標準方法。

有比非標準cookie的方式處理這個更好的方法。不確定您使用的是哪個版本的spring-security,HERE是用於保護RESTful應用程序的spring-security 3.1的一個示例。

編輯:

退房this link。這迫使tomcat(不知道你是否使用tomcat)不使用cookie來處理會話。但一旦完成,這將不會處理基於cookie的會話。我不是100%確定它會工作,但你可以嘗試。

+0

我絕對同意餅乾基礎的認證系統對REST不好,但這不是我們的決定。現在,我們需要在URL中使用jsessionId而不是cookie來製作工作機制。 – Mikhail 2012-02-20 13:47:45

+0

這不是一件容易的事情,也不是一種開箱即用的方式。由容器生成的jsessionid附加的URL arae,它知道如何處理它們。對於REST URL,它們不會生成,因此服務器不準備處理它們。 – Santosh 2012-02-20 15:37:05

+0

所以你的要求是:它應該決定運行時,如果cookie被支持,然後使用cookie,否則使用url重寫? – Santosh 2012-02-20 15:38:08

相關問題