请注意,本文编写于 2474 天前,最后修改于 1976 天前,其中某些信息可能已经过时。
问题
今天学习SpringSecurity自定义表单登录的时候,一直报
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"源代码为:
package cn.notelist.springsecurity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.stereotype.Component;
/**
* @ClassName: MyUserDetailsService
* @Description:
* @Author ye21st
* @Date 2019-08-08 11:31:13
*/
@Component
public class MyUserDetailsService implements UserDetailsService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.info("登录用户名:" + username);
return new User(username, "123456",true,true,true,
true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}看报错信息是因为安全机制,不允许明文密码登录,必须是加密后的密码才能运行登录,那么我们需要进行如此修改:
原有的SpringSecurityConfig类文件,新增PasswordEncoder:
package cn.notelist.springsecurity.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* @ClassName: SecutityConfig
* @Description:
* @Author ye21st
* @Date 2019-07-30 11:28:05
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* @description [密码加密器]
* @title passwordEncoder
* @author ye21st
* @date 2019-08-08
* @time 14:29
* @return org.springframework.security.crypto.password.PasswordEncoder
**/
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}原有自定义表单登录代码部分,新增如下:
package cn.notelist.springsecurity;
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;
/**
* @ClassName: MyUserDetailsService
* @Description:
* @Author ye21st
* @Date 2019-08-08 11:31:13
*/
@Component
public class MyUserDetailsService implements UserDetailsService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.info("登录用户名:" + username);
return new User(username, passwordEncoder.encode("123456"),true,true,true,
true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}将代码进行如上修改,再重新进行表单登录,即可正常访问。