当前位置: 首页 > 知识库问答 >
问题:

Spring Security中没有为id“null”映射的PasswordEncoder

潘慈
2023-03-14

我正在从Spring Boot 1.5.12迁移到Spring Boot 2.0和Spring Security 5,并试图通过OAuth 2进行身份验证。但即使在使用委托{noop}之后,我也会遇到这个错误:

Java语言lang.IllegalArgumentException:没有为id“null”映射的PasswordEncoder

这是我的代码:

SecurityConfig安全配置

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    
    @Autowired
    private CustomUserDetailsService userDetailsService;
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    public SecurityConfig() {
        super();
        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
            http.cors().and().csrf().disable().exceptionHandling().and().authorizeRequests()
                .antMatchers("/api/v1/**")
                .authenticated().and().httpBasic();
    }

    @Override
    public void configure(final WebSecurity web) throws Exception {
            web.ignoring().antMatchers(
                "/v2/api-docs","/configuration/ui","/swagger-resources", "/configuration/security", "/webjars/**",
                "/swagger-resources/configuration/ui","/swagger-resources/configuration/security",
                "/swagger-ui.html", "/admin11/*", "/*.html", "/*.jsp", "/favicon.ico", "//*.html", "//*.css", "//*.js",
                "/admin11/monitoring","/proxy.jsp");
    }

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

Oauth 2授权服务器配置

public class Oauth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Autowired
    private CustomUserDetailsService userDetailsService;
    
    @Autowired
    private JdbcTokenStore jdbcTokenStore;
    
    @Bean
    public TokenStore tokenStore() {
        return jdbcTokenStore;
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        CustomTokenEnhancer converter = new CustomTokenEnhancer();
        converter.setSigningKey("secret_api");
        return converter;
    }

    @Override
    public void configure(final AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
                
        endpoints.tokenStore(tokenStore())
                .accessTokenConverter(accessTokenConverter())
                .authenticationManager(authenticationManager)
                .userDetailsService(userDetailsService)
                .pathMapping("/oauth/token", "/api/v1/oauth/token");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("app").secret("{noop}secret")
                .authorizedGrantTypes("password", "authorization_code").scopes("read", "write")
                .autoApprove(true).accessTokenValiditySeconds(0);
    }

    @Override
    public void configure(final AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
    }
    
    @Bean
    public DefaultTokenServices defaultTokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }
}

CustomUserDetailsService

public interface CustomUserDetailsService extends UserDetailsService {

    UserDetails getByMsisdn(String msisdn);

    void initDummyUsers();
}

为了解决这个问题,我尝试了Stackoverflow的以下问题:

Spring Boot PasswordEncoder错误

共有1个答案

严知
2023-03-14

Spring Security文档正在解决您的确切问题。

当存储的密码之一没有密码存储格式中所述的id时,会发生以下错误。

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped
for the id "null"
     at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:233)
     at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:196)

解决此错误的最简单方法是切换到显式提供密码编码所用的PasswordEncoder。解决此问题的最简单方法是找出密码当前的存储方式,并显式提供正确的PasswordEncoder。

如果您正在从Spring Security 4.2迁移。通过公开NoOpPasswordEncoder bean,可以恢复到以前的行为。

因此,您应该能够通过显式提供PasswordEncoder来解决此问题

// remember, its bad practice
@Bean
public PasswordEncoder passwordEncoder() {
    return NoOpPasswordEncoder.getInstance();
}

或者更好地提供自定义的密码编码器委托器:

String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());

PasswordEncoder passwordEncoder =
    new DelegatingPasswordEncoder(idForEncode, encoders);

所有这些都来自于官方的Spring Security文档中的密码编码。

 类似资料:
  • 我的代码在spring版本1.5.6中运行良好。释放。但当我将版本升级到2.0.0时,我的一些方法已被弃用,但效果很好。当我通过查看没有为id“null”映射的PasswordEncoder和数据库身份验证来更改我不推荐的方法时,它开始给我错误“没有PasswordEncoder” 这是我的代码。 网络配置 账户控制员 用户服务 我看到了所有相关的答案,但它们可用于inMemory身份验证。Spr

  • 问题内容: 我正在从Spring Boot 1.4.9迁移到Spring Boot 2.0,还迁移到Spring Security 5,并且正在尝试通过OAuth 2进行身份验证。但是我收到此错误: java.lang.IllegalArgumentException:没有为id“ null映射的PasswordEncoder 从Spring Security 5的文档中,我知道密码的存储格式已更

  • 我正在从Spring Boot1.4.9迁移到Spring Boot2.0,也迁移到Spring Security5,我试图通过OAuth2进行身份验证。但是我得到了这个错误: IllegalArgumentException:没有为id“null”映射的PasswordEncoder 编码密码不像BCrypt 因此,我根据Spring Security5文档将编码器更新为: 现在,如果我能在数据

  • 我是springsecurity的新手,尝试在我的项目中使用springstecurity,因为这个错误不断出现 这是我的道课 这是我的凭证类 我认为错误存在于此代码中 这是用户详细信息 这是用户详细信息的实现 这就是正在流行的错误 最后,这是我的数据库,其中存储了用户名和密码的数据库表 这个错误让我发疯,我做了一切事情来阻止这一点,但这是一次又一次的弹出,基本上我的项目是logIn系统,其中一个

  • 我是Spring安全的新手。使用Spring 4.3和Spring Security 5.0。一切都在运行。登录页面也出现了。如果您输入了错误的密码,则表明您的登录尝试未成功,请重试。好但正确的密码引发异常 我的Spring\u安全。XML是 我的网站。xml 我的控制器类 .一旦获得正确的凭据,就没有为id“null”映射的密码编码器

  • 我目前正在使用h2数据库学习SpringSecurity和spring boot。 当我尝试通过它抛出的用户名和密码登录时,我使用jdbcAuthentication进行身份验证: <代码>java。lang.IllegalArgumentException:没有为id“null”映射的密码编码器 我使用密码编码器作为:。 这是错误日志 这是我的SpringSecurity课程 SpringSec