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教程(10)---- 自定义登录成功后的处理程序及修改默认验证地址
Spring 社交登录和 Spring Security 自定义身份验证管理器