目录
一、报错描述
- 一、报错描述
- 二、报错原因
- 三、解决方式
- 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密码,跳转成功,如下图: