报错:java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null“解决的方式(代码片

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了报错:java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null“解决的方式(代码片相关的知识,希望对你有一定的参考价值。

一、报错描述

  • springboot项目整个spring security权限管理,表单验证输入用户名和密码页面无响应,控制台报错如下图:

二、报错原因

  • lz自定了一个处理用户校验逻辑MyUserDeitailsService类,实现了UserDetailsService接口,但是在SecurityConfig配置类中没有注入PasswordEncoder实例,导致报错。

  • MyUserDeitailsService类代码如下:

    @Component
    public class MyUserDeitailsService implements UserDetailsService {
    
        private Logger logger=LoggerFactory.getLogger(getClass());
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            logger.info("前端输入的登录用户名:"+username);
    
            //根据用户名称查找用户信息的具体逻辑
            logger.info("根据用户名称查找用户信息的具体逻辑====");
            /**
             * 返回security.core包中的一个User对象
             * 第1个参数是前端传的用户名
             * 第2个参数是数据库中存储用户名对应的密码
             * 第3个参数是指用户对应的权限(集合类型),默认给了一个管理员权限
             */
            User user = new User(username, "123456",
                    AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
            return user;
        }
    }
    
  • Security配置类代码如下:

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.formLogin()
                    .and()
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated();
        }
    }
    

三、解决方式

  • 因为lz密码是密文匹配,所以需要在Security配置类中注入PasswordEncoder实例,代码如下:

    import org.springframework.context.annotation.Bean;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Bean
        public PasswordEncoder passwordEncoder(){
            return new BCryptPasswordEncoder();
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.formLogin()
                    .and()
                    .authorizeRequests()
                    .anyRequest()
                    .authenticated();
        }
    
    }
    

  • 在MyUserDeitailsService类中同样需要注入PasswordEncoder,并把明文密码进行加密,代码如下:

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.authority.AuthorityUtils;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.security.crypto.password.PasswordEncoder;
    import org.springframework.stereotype.Component;
    @Component
    public class MyUserDeitailsService implements UserDetailsService {
    
        private Logger logger=LoggerFactory.getLogger(getClass());
    
        @Autowired
        private PasswordEncoder passwordEncoder;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            logger.info("前端输入的登录用户名:"+username);
    
            //根据用户名称查找用户信息的具体逻辑
            logger.info("根据用户名称查找用户信息的具体逻辑====");
            /**
             * 返回security.core包中的一个User对象
             * 第1个参数是前端传的用户名
             * 第2个参数是数据库中存储用户名对应的密码
             * 第3个参数是指用户对应的权限(集合类型),默认给了一个管理员权限
             */
            String password =passwordEncoder.encode("123456");
            logger.info("前端用户输入的密码进行加密:"+password);
            User user = new User(username, password,
                    AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
            return user;
        }
    }
    

  • 在次启动项目,浏览器登录表单输入用户名和指定的123456密码,跳转成功,如下图:


以上是关于报错:java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id “null“解决的方式(代码片的主要内容,如果未能解决你的问题,请参考以下文章

[转]Linux下使用JNI的常见问题及解决方案

Spring Test DBUnit:无法从文件加载数据集

JPA 认为我正在删除一个分离的对象

JRebel启动报错

tomcat 500报错

tensorflow报错 或者 keras报错 以及tf.keras报错: OOM 显存不足