WebSecurityConfigurerAdapter已弃用,如何配置formLogin()实现默认登录表单?
问题修复方案
1. 启用默认表单登录
当前配置使用httpBasic(HTTP基础认证),不会触发Spring Security的默认登录表单。需要替换为formLogin(Customizer.withDefaults())来启用表单登录功能,访问受保护接口时会自动跳转至默认登录页面。
2. 修正角色配置错误
- 你创建的
user用户被错误赋予了ADMIN角色,但/user接口要求USER角色,导致该用户无法访问对应接口; /admin接口的hasRole("Admin")存在大小写问题,Spring Security角色名大小写敏感,你定义的角色是ADMIN,因此需改为hasRole("ADMIN")。
3. 优化密码编码使用
将PasswordEncoder通过构造方法注入到userDetailsManager方法中,避免重复调用passwordEncoder()方法,更符合Spring依赖注入规范。
修正后的WebSecurityConfig代码
package projet.auth.login.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class WebSecurityConfig { private final PasswordEncoder passwordEncoder; public WebSecurityConfig(PasswordEncoder passwordEncoder) { this.passwordEncoder = passwordEncoder; } @Bean public InMemoryUserDetailsManager userDetailsManager(){ UserDetails user = User .withUsername("user") .password(passwordEncoder.encode("password")) .roles("USER") .build(); UserDetails admin = User .withUsername("admin") .password(passwordEncoder.encode("password")) .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(user, admin); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{ return http .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(auth -> { auth.requestMatchers("/").permitAll(); auth.requestMatchers("/user").hasRole("USER"); auth.requestMatchers("/admin").hasRole("ADMIN"); auth.anyRequest().authenticated(); }) .formLogin(Customizer.withDefaults()) .build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
效果说明
- 访问
/user或/admin时,会自动跳转到Spring Security默认登录页面; user用户拥有USER角色,可访问/user但无法访问/admin;admin用户拥有ADMIN角色,可访问/admin;若需让admin也能访问/user,可将auth.requestMatchers("/user").hasRole("USER")改为auth.requestMatchers("/user").hasAnyRole("USER", "ADMIN")。
内容的提问来源于stack exchange,提问作者Léandre
相关产品推荐
相关产品推荐

