Spring Security 自定义登录处理 URL 始终重定向到故障处理程序

Posted

技术标签:

【中文标题】Spring Security 自定义登录处理 URL 始终重定向到故障处理程序【英文标题】:Spring Security Custom Login Processing URL always redirecting to failurehandler 【发布时间】:2019-07-05 08:06:35 【问题描述】:

我正在开发一个带有基于注释配置的 spring 安全代码。

但是在从登录页面点击 WebSecurityConfig 类(扩展 WebSecurityConfigurerAdapter )的 configure 方法中定义的登录处理 url 后,它总是重定向到httpSecurity.failureHandler() 方法而不是 .successHandler() 即使正确的 用户名密码 提供。

以下是WebSecurityConfig类的configure方法和configureGlobal方法。

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception 

    httpSecurity
    .authorizeRequests()
    .antMatchers("/login.success").access("hasRole('ROLE_USER')")
            .and()
            .formLogin()
            .loginPage("/login.home")
            .usernameParameter("username")
            .passwordParameter("password")
            .loginProcessingUrl("/login.do")
            .successHandler(applicationLoginSuccessHandler)
            .failureHandler(applicationLoginFailureHandler)
            .and()
            .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));


@Autowired
public void configureGlobal(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception 
    authenticationManagerBuilder.inMemoryAuthentication().withUser("user").password("pass").roles("USER");

   

这里是login.jsp

的sn-p
<c:url value="login.do" var="loginUrl"/>
<form action="$loginUrl" method="POST">         
    <c:if test="$param.error != null">          
        <p>  
            Invalid username and password.  
        </p>  
    </c:if>  
    <c:if test="$param.logout != null">         
        <p>  
            You have been logged out.  
        </p>  
    </c:if>  
    <p>  
        <label for="username">Username</label>  
        <input type="text" id="username" name="username"/>      
    </p>  
    <p>  
        <label for="password">Password</label>  
        <input type="password" id="password" name="password"/>      
    </p>  
    <input type="hidden"                          
        name="$_csrf.parameterName"  
        value="$_csrf.token"/>  
    <button type="submit" class="btn">Log in</button>  
</form>  

我错过了什么?

我正在使用 Spring Security 5.1.2.release

【问题讨论】:

【参考方案1】:

它一直在工作。实际上,我为此错过了密码编码器。虽然我给了一个重定向到成功页面。

【讨论】:

【参考方案2】:

登录页面和注销页面必须可供所有人访问。在登录配置和注销配置之后,您错过了 .pemitAll() 方法

【讨论】:

我试过 .loginPage("/login.home").permitAll().usernameParameter("username") .passwordParameter("password") ,但没有运气。 我认为这是因为用户凭据。检查这一点,将 configureGlobal(...) 方法中的 .password(...) 方法更改为 .password("nooppass"). @Override public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException httpServletResponse.setStatus(HttpServletResponse.SC_OK); httpServletResponse.sendRedirect("./login.success"); HttpSession httpSession = httpServletRequest.getSession(); 这是successHandler的onAuthenticationSuccess方法。与发送重定向方法有什么关系???

以上是关于Spring Security 自定义登录处理 URL 始终重定向到故障处理程序的主要内容,如果未能解决你的问题,请参考以下文章

spring-security 个性化用户认证流程——自定义登录成功/失败的处理

Spring Security 自定义登录认证

Spring Security教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址

Spring 社交登录和 Spring Security 自定义身份验证管理器

SpringBoot集成Spring Security——自定义表单登录

Spring Security 3.1.1 - 自定义登录成功问题