Spring Security 5+Spring Boot 2.0.0:permitAll不生效的登录重定向问题解决
Spring Security 5 + Spring Boot 2.0.0 正确配置用户认证与开放接口
我明白你现在遇到的问题——明明配置了permitAll(),但访问/hello还是被重定向到登录页。这大概率是因为配置顺序不对,或者没踩中Spring Security的规则优先级。下面给你一个完整的可运行配置,再拆解关键要点帮你理解:
完整配置示例
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { // 配置用户数据源(这里用内存用户做示例,实际项目可以替换为数据库查询) @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("regularUser") .password("{noop}userPass123") // Spring Security 5必须指定密码编码方式,{noop}表示明文(仅测试用) .roles("USER") .and() .withUser("adminUser") .password("{noop}adminPass456") .roles("ADMIN"); } // 核心的HTTP权限配置 @Override protected void configure(HttpSecurity http) throws Exception { http // 先设置开放路径,这一步顺序绝对不能乱! .authorizeRequests() .antMatchers("/hello").permitAll() // 让/hello完全开放,无需认证 .anyRequest().authenticated() // 除了上面的路径,其他所有请求都需要认证 .and() // 配置默认的表单登录(如果是REST接口可以换成httpBasic()) .formLogin() .permitAll() // 登录页面本身必须允许匿名访问,不然用户连登录入口都没有 .and() // 开放退出登录接口 .logout() .permitAll(); } // 生产环境推荐用这个密码编码器(替换上面的{noop}) /* @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } */ }
关键注意事项
- 规则顺序是核心:Spring Security会按你配置的顺序匹配请求规则,
permitAll()的规则必须放在anyRequest().authenticated()之前。如果反过来,所有请求都会先被要求认证,你的开放路径规则根本不会被触发。 - 密码编码强制要求:Spring Security 5开始不再支持明文密码(除非用
{noop}声明),生产环境一定要用BCryptPasswordEncoder这类强加密编码器。如果配置了自定义的PasswordEncoderBean,密码就不需要加{noop}前缀了。 - 登录页必须开放:
formLogin().permitAll()是必须的,否则未认证用户连登录页面都访问不了,会陷入无限重定向。
额外排查点
- 检查
/hello路径是否有拼写错误,或者是否有其他自定义Filter在Spring Security之前拦截了请求; - 如果是RESTful接口,不需要表单登录的话,可以把
formLogin()换成httpBasic(),这样会触发HTTP基础认证弹窗,而不是重定向到登录页。
内容的提问来源于stack exchange,提问作者SpaceNet
相关产品推荐
相关产品推荐

