2015-04-30 153 views
0

我需要乾淨的URL而不是附加的擴展名。我在我的UI中使用了Backbone.js框架。我建立了一個視圖,收集用戶名和密碼,並執行一個寧靜的請求/j_spring_security_check沒有JSP的Spring Security/j_spring_security_check

由於某種原因,用戶名和密碼未被/j_spring_security_check終結點​​看到。

下面是我在表演骨幹請求:

loginModel.save(loginModel.toJSON(), { 
    success: _.bind(function(response) { 
     Backbone.history.navigate('', {trigger: true}); 
    }, this), 
    error: function() { 
     console.log('test'); 
    } 
}); 

我試圖讓與爲j_username和爲j_password作爲模型的屬性,這樣的請求和URL設置爲/j_spring_security_check

我也試過直接在網址傳遞PARAMS這樣:

/jspring_security_check?j_username=X&j_password=Z 

兩種方式進入我的身份驗證提供者進行身份驗證方法,但憑據主要都是空字符串,因此身份驗證失敗。

{j_username: "a", j_password: "a"} j_password: "a" j_username: "a" 

什麼是做出/j_spring_security_check請求不使用JSP形式的正確方法:

當我把我的請求,我可以在瀏覽器的開發者工具,請求負載被setnt下來看看?

回答

1

讓我們看看Spring的類進行驗證,而 /org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java

private boolean postOnly = true; 

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { 
    if (postOnly && !request.getMethod().equals("POST")) { 
     throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); 
    } 

您發送帶有/ jspring_security_check?爲j_username = X & GET請求j_password = Z,當它期望一個POST請求。

該請求必須是包含Content-Type'application/x-www-form-urlencoded'和兩個參數的POST請求。請求的主體不應該是JSON對象。

我建議重新設計您的登錄名並不要使用Ajax。

j_spring_security_check不適用於通過Ajax從登錄頁面調用。它旨在接受來自HTML表單的POST請求,然後在HTTP響應中呈現應用程序主頁以提交登錄表單。

j_spring_security_check的功能是對用戶進行身份驗證,如果身份驗證成功,則會創建會話並將用戶重定向到主屏幕,否則會將用戶重定向到「登錄失敗」屏幕。 j_spring_security_check返回302重定向的HTTP代碼。

RESTful登錄是可能的,但您將不得不配置j_spring_security_check以成功(或失敗)登錄視圖進行響應,但使用JSON,因此您必須在Java端編寫自定義登錄處理程序。我曾經這樣做過,並且使代碼(Java和ExtJS)變得如此複雜,以至於我回到了基於表單的登錄。畢竟,Facebook和Google使用表單提交登錄,這很正常。在我的情況下,切換到Ajax REST登錄是不值得的。

表單提交的另一個優點是,Web瀏覽器可以記住用戶名和密碼,這是不可能的基於Ajax的登錄,我想這就是爲什麼谷歌和Facebook都使用表單提交的原因。

但是,如果你決定,你仍然需要基於Ajax的登錄(這是我極力勸阻,因爲執行和因爲用戶體驗的複雜性將不能正常工作,瀏覽器的密碼管理器NE傷害),那麼你將不得不創建兩個Spring MVC控制器,一個用於成功登錄(loginSucessController),另一個用於登錄失敗(loginFailureController),兩個控制器都應該返回一個具有登錄狀態的統一JSON響應。然後,配置Spring Security使用上面

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:sec="http://www.springframework.org/schema/security" 
     xsi:schemaLocation= 
       "http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
<sec:http> 
      <sec:intercept-url pattern="/**"/> 
      <sec:http-basic/> 
      <sec:form-login default-target-url="/loginSucessController" authentication-failure-url="/loginFailureController"/> 
      <sec:logout/> 
    </sec:http> 
</beans> 

當然兩個控制器,你必須創建映射,並實現了loginSucessController和loginFailureController,我跳過這一部分。

loginSucessController應該返回

{ "loginStatus": 1 } 

和loginFailureController應該返回

{ "loginStatus": 0 } 

您還必須創建第三MVC控制器,用於檢測用戶是否已經登錄,以決定是否登錄表單已被所示,當用戶返回到應用程序的網頁,使用org.springframework.security.core.context.SecurityContextHolder#的getContext

+0

的問題我使用JSP是我的主幹視圖全部使用HTML模板來構建html視圖。所以爲了使用JSP頁面,我必須去建立一個沒有骨幹的頁面。我寧願使用骨幹框架構建整個應用程序。 – nmb1106

+0

當我使用主幹時,使用JSP登錄表單的最佳方式是什麼?是否有可能將jsp嵌入到骨幹視圖中? – nmb1106

+0

當我使用ExtJS開發應用程序時,我創建了一個單獨的靜態HTML網頁用於登錄,它根本沒有使用JavaScript。用戶在成功登錄後被重定向到ExtJS應用程序html文件,這是最簡單的方法。 –