Spring Security未生效求助:可直接通过URL跳过登录验证
问题分析与解决方案
嘿,我一眼就揪出你这个问题的核心了——你把关键的.anyRequest().authenticated()给注释掉了!这就导致Spring Security只对根路径(/)做权限校验,其他所有页面的请求都没被要求认证,所以用户直接输入页面URL就能跳过登录,完全绕开了你的登录验证逻辑。
问题出在这儿
看你贴的配置代码:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").hasAnyRole("Administrator" , "Member") //.anyRequest().authenticated() // 这里被注释掉了! .and() .formLogin() .permitAll() .loginPage("/login").permitAll() .defaultSuccessUrl("/dashboard") .failureUrl("/login?error") .successHandler(authenticationSuccessHandler); // 补全你没写完的部分 }
这段配置只限制了访问根路径需要Administrator或Member角色,但其他任何请求(比如/dashboard)都没有被要求必须登录,自然可以直接访问。
修正后的配置
把注释掉的.anyRequest().authenticated()恢复,同时确保登录相关的路径已经通过permitAll()放行,这样就能保证所有请求都需要认证,只有登录页面、登录提交等路径可以匿名访问:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/").hasAnyRole("Administrator" , "Member") .anyRequest().authenticated() // 必须加上这行! .and() .formLogin() .loginPage("/login") // 自定义登录页面 .permitAll() // 放行登录页面、登录提交、错误页面等相关请求 .defaultSuccessUrl("/dashboard") .failureUrl("/login?error") .successHandler(authenticationSuccessHandler) // 你的成功处理器 .and() .logout() // 建议加上logout配置,完善登录流程 .permitAll(); }
额外说明
.anyRequest().authenticated()的作用是:所有没有被antMatchers明确匹配的请求,都必须经过认证才能访问,这是Spring Security配置里的核心规则之一,不能随便注释掉。.formLogin().permitAll()已经自动放行了登录页面(/login)、登录提交路径(默认是/loginPOST请求)、登录失败路径(/login?error)等相关请求,不需要额外再单独配置这些路径的放行规则。
内容的提问来源于stack exchange,提问作者user9702608
相关产品推荐
相关产品推荐

