2011-03-28 337 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页面的方法。

    相关问题