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
相关产品推荐
相关产品推荐

