Spring Boot整合Spring Security登录后无法跳转至成功页面求助
我帮你排查了下代码,发现两个关键问题导致登录后一直重定向回登录页,下面是具体的问题分析和解决方案:
问题1:登录表单缺少CSRF令牌
Spring Security默认启用了CSRF保护机制,你的登录表单使用POST方式提交,但没有携带CSRF令牌,这会导致请求被框架拦截,最终认证失败并重定向回登录页。
解决方法:在登录表单里添加CSRF令牌字段,修改你的index.ftl:
<!DOCTYPE html> <#import "/spring.ftl" as spring /> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="<@spring.url '/login' />" method="post"> <!-- 添加CSRF令牌 --> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> username:<input type="text" name="username"><br> password:<input type="password" name="password"><br> <input type="submit" value="login"> </form> </body> </html>
问题2:密码未通过PasswordEncoder加密
Spring Security 5及以上版本强制要求密码必须通过PasswordEncoder加密处理,你当前的内存认证直接使用明文密码,会导致认证逻辑失败,而且因为没有配置详细的调试日志,所以看不到失败原因。
解决步骤:
- 在
SecurityConfig中添加PasswordEncoder的Bean:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired MyUserDetailsService detailsService; // 新增PasswordEncoder Bean @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // ... 其他原有配置 @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .passwordEncoder(passwordEncoder()) // 指定密码编码器 .withUser("admin") .password(passwordEncoder().encode("admin")) // 对明文密码加密 .roles("USER"); } }
额外优化建议
- 开启Spring Security调试日志,方便后续排查问题,在
application.properties中添加:
logging.level.org.springframework.security=DEBUG
- 如果希望无论用户是直接访问登录页还是被重定向到登录页,登录成功后都强制跳转到
/user/welcome,可以修改defaultSuccessUrl的配置:
.defaultSuccessUrl("/user/welcome", true)
第二个参数设为true表示忽略之前的请求地址,强制跳转到指定页面。
内容的提问来源于stack exchange,提问作者Aezio
相关产品推荐
相关产品推荐

