报错: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“解决的方式(代码片的主要内容,如果未能解决你的问题,请参考以下文章