You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security配置的公开URL仍跳转登录页,USER角色也无法访问如何解决

Spring Security 路径拦截异常解决方案

核心问题原因

你遇到的问题是授权规则声明顺序错误导致的:
Spring Security的antMatchers授权规则按照从上到下的顺序匹配,只要命中第一条符合路径的规则就会直接生效,终止后续规则的校验。
你将匹配所有路径的/**规则放在了最前面,所有访问请求都会先命中「需要ADMIN角色」的规则,后续的放行规则、USER角色校验规则全部不会触发,自然会出现放行路径跳登录、USER角色访问对应路径被拦截的问题。

修正后的配置

将规则按照「路径范围越小越靠前」的原则调整顺序即可:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()
            .authorizeRequests()
            // 路径范围最精准的放行规则放最前
            .antMatchers("/", "/registration/**", "/view/**").permitAll()
            // 其次是需要特定角色的细分路径规则
            .antMatchers("/new/**", "/edit/**", "/create/**", "/save/**").hasAnyRole("USER", "ADMIN")
            // 范围最大的全路径规则放最后
            .antMatchers("/**").hasRole("ADMIN")
            
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login").permitAll()
            .defaultSuccessUrl("/")
            .and()
            .logout().invalidateHttpSession(true)
            .clearAuthentication(true)
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/loggingOut").permitAll();
}

补充注意事项

  • hasRole、hasAnyRole方法会自动给传入的角色名拼接ROLE_前缀,如果你的系统中存储的角色没有此前缀,要么给存储的角色加上ROLE_前缀,要么替换成hasAuthority、hasAnyAuthority方法完成校验,避免角色匹配失败。
  • 写授权规则时永远遵循「特殊规则在前,通用规则在后」的原则,避免规则被覆盖。

学习建议

你可以优先学习Spring Security官方文档中HttpSecurity配置、授权规则匹配逻辑、角色权限配置相关的核心章节,搭配小型Demo练习即可快速掌握常见配置逻辑。

内容的提问来源于stack exchange,提问作者JavaGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:45:04