Spring Security编程式内存UserDetailsService仅配用户名角色无密码实现问题
疑问1解答
你的假设完全成立,XML配置和编程式配置的能力完全对等。你之前编程式写法报错的原因是Spring Security 5+对User类的构造参数增加了非空校验,而XML配置的解析逻辑会自动为未声明密码的用户填充一个无意义的占位空密码,不会触发校验规则,所以能正常运行。
疑问2解答
你的场景下,内存UserDetailsService仅作为权限补充源使用,密码校验逻辑完全由Active Directory认证Provider处理,用户登录时会先由AD完成账号密码校验,校验通过后才会从内存用户服务中拉取对应用户的权限补充到认证信息中,全程不会用到内存中存储的密码字段,所以只需要显式设置一个占位密码即可复现XML配置的效果,以下是两种可用的实现方案:
方案1:直接在Builder中设置占位密码
auth.authenticationProvider(adAuthProvider); auth.inMemoryAuthentication() .withUser("user") // 密码设置为任意值即可,不会被实际使用,{noop}前缀表示不需要编码校验 .password("{noop}") .roles("USER");
方案2:手动构造InMemoryUserDetailsManager(更接近XML底层实现)
// 手动构造用户实例,仅配置用户名和权限 UserDetails adUser = User.withUsername("user") .authorities("ROLE_USER") .password("{noop}") .build(); // 初始化内存用户管理器 InMemoryUserDetailsManager xmlEquivalentUserService = new InMemoryUserDetailsManager(adUser); // 注册到认证构造器 auth.authenticationProvider(adAuthProvider); auth.userDetailsService(xmlEquivalentUserService);
两种方案都和你之前的XML配置效果完全一致,不需要额外配置密码编码器,也不会触发启动异常。
内容的提问来源于stack exchange,提问作者Bruno Genovese
相关产品推荐
相关产品推荐

