2011-03-28 202 views
8

我們有兩種登錄方式。Spring Security:如果認證失敗,重定向到登錄頁面

  • 用戶名和密碼由另一個應用程序在請求標題中發送。 IT將被檢查,如果用戶名和密碼正確,則會進入。[爲此編寫自定義過濾器]
  • 如果請求標頭中沒有用戶名和密碼,則會顯示登錄屏幕。
  • 當用戶名和密碼都在請求頭,如果它的錯,我所示的HTTP狀態401 - 身份驗證失敗:錯誤的憑據頁。

    如何在顯示身份驗證失敗的情況下顯示登錄頁面。

    下面是在security.xml文件的代碼

    <http auto-config="true" use-expressions="true"> 
          <access-denied-handler error-page="/login.jsp"/> 
          <intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/> 
          <intercept-url pattern="/*" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')"/> 
          <custom-filter ref="requestHeaderFilter" before="FORM_LOGIN_FILTER"/> 
          <form-login login-page="/login.jsp"/> 
    
        </http> 
    

    請讓我知道如果你需要更多的信息。

    編輯:添加RequestHeader濾波器的代碼在我的申請

    public class RequestHeaderProcessingFilter extends AbstractAuthenticationProcessingFilter{ 
    
    private String usernameHeader = "j_username"; 
    private String passwordHeader = "j_password"; 
    
    
    protected RequestHeaderProcessingFilter() { 
        super("/login_direct"); 
    } 
    
    //getters and setters 
    
    @Override 
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException { 
        String username = request.getHeader(usernameHeader); 
        String password = request.getHeader(passwordHeader); 
    
        SignedUsernamePasswordAuthenticationToken authRequest = 
         new SignedUsernamePasswordAuthenticationToken(username, password); 
    
         return this.getAuthenticationManager().authenticate(authRequest); 
    } 
    

    }

    回答

    0

    上認證失敗的默認行爲是顯示HTTP狀態401情況下SimpleUrlAuthenticationFailureHandler用於處理故障(如由AbstractAuthenticationProcessingFilter完成,通過將defaultFailureUrl設置爲/login.jsp可以覆蓋此行爲。

    或者,可以使用sui定義自定義錯誤處理程序錶行動。

    +0

    嗨Raghuram,謝謝。我應該在哪裏配置defaultFailureUrl?我必須插入它,在我上面提供的代碼中? – vinoth 2011-03-28 13:01:34

    +0

    @vinoth。它取決於'requestHeaderFilter'實現的實現。答案中提到的類顯示了這樣做的一種方法 – Raghuram 2011-03-28 13:14:17

    +0

    嗨,我已經添加了requestHeaderFilter的實現。我們應該改變嗎? – vinoth 2011-03-28 13:21:53

    2

    要顯示的情況下,驗證失敗,你應該在<access-denied-handler error-page="/login.jsp"/>相同的URL和<intercept-url pattern="/*Login*" access="hasRole('ROLE_ANONYMOUS')"/>

    例如登錄頁面:

    <global-method-security secured-annotations="enabled" /> 
    
    <http auto-config="true" access-denied-page="/app/sesiones/procesarLogin"> 
        <logout logout-success-url="/app/sesiones/login" /> 
        <form-login 
         authentication-failure-url="/app/sesiones/login?error=true" 
         login-page="/app/sesiones/login" default-target-url="/app/sesiones/procesarLogin" /> 
        <intercept-url pattern="/app/privados/*" access="ROLE_USER" /> 
    </http> 
    
    在這個例子

    ,用戶也被重定向到登錄後登錄頁面。/procesarLogin是一個發送用戶lo login.jsp頁面的方法。

    相關問題