您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 3浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

小志的博客 发布时间:2021-09-23 23:01:46 ,浏览量:3

目录
    • 一、报错描述
    • 二、报错原因
    • 三、解决方式

一、报错描述
  • 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密码,跳转成功,如下图: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.1423s