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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:35:54