一、UserDetailsService源码
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
二、UserDetails详解
public interface UserDetails extends Serializable {
// 权限 授权,获得当前用户的所有权限
Collection<? extends GrantedAuthority> getAuthorities();
// 获得当前用户的密码
String getPassword();
// 获得当前用户的用户名
String getUsername();
// 判断账号是否失效
boolean isAccountNonExpired();
// 判断账号是否被锁定
boolean isAccountNonLocked();
// 密码是否失效
boolean isCredentialsNonExpired();
// 当前用户是否能够使用
boolean isEnabled();
}
三、代码实现
自定义一个实现类
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (!"admin" .equals(username)){
throw new UsernameNotFoundException("用户名不存在");
}
// 从数据库中查找密码
String password = "yan";
UserDetails userDetails = new User(username, password,
AuthorityUtils.commaSeparatedStringToAuthorityList("admin1,admin2"));
return userDetails;
}
}
运行会报错,因为需要密码解析器
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
四、PasswordEncoder
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
先使用测试类来进行测试,通过MD5进行加密
@Test
void passwordEncoderTest () {
// BCryptPasswordEncoder
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String yan = passwordEncoder.encode("yan");
System.out.println(yan);
}
$2a$10$x2FU7rTI/j4swiODh2EsGulB8iHd.DRPN/.PTOwfpR85AqWEOKeu2
配置config
@Configuration
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (!"admin" .equals(username)){
throw new UsernameNotFoundException("用户名不存在");
}
// 从数据库中查找密码
String password = "yan";
String encoder = passwordEncoder.encode(password);
UserDetails userDetails = new User(username, encoder,
AuthorityUtils.commaSeparatedStringToAuthorityList("admin1,admin2"));
return userDetails;
}
}