文章目录
- 一、修改密码编码器
- 二、效果
- 三、注意点
- 1. RegisteredClient
- 2. UserDetailsService
一、修改密码编码器
以BCryptPasswordEncoder
举例。
直接将其注册成PasswordEncoder
的Bean
即可。
@Bean
public PasswordEncoder passwordEncoder() {
// 密码为明文方式
// return NoOpPasswordEncoder.getInstance();
// 或使用 BCryptPasswordEncoder
return new BCryptPasswordEncoder();
}
二、效果
使用了加密算法后,无论是RegisteredClient
的密码还是UserDetailsService
的密码,都会以密文的方式存储在服务器上。
但是前端输入的密码仍然是以明文
的方式出现并传到服务器,之后服务器会对明文进行相同的手段(指对同样的明文,密文相同)加密,比较两个密文是否一致。
三、注意点
1. RegisteredClient
@Bean
public RegisteredClientRepository registeredClientRepository() {
RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
.clientId("XcWebApp")
.clientSecret(passwordEncoder().encode("XcWebApp"))
.build();
return new InMemoryRegisteredClientRepository(registeredClient);
}
RegisteredClient
中clientSecret
仍然需要提供密文。
是因为,加密这个行为,只在服务器校验前端发送的明文时使用,至于对照物,则是代码中提供好的密文,所以这个需要提供密文。
2. UserDetailsService
对于UserDetailsService
也是,密码也需要提供现成的密文形式。
下面的代码中数据库保存的是password密文。
@Component
@Slf4j
public class UserServiceImpl implements UserDetailsService {
@Autowired
XcUserMapper xcUserMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//根据username查询数据库
XcUser xcUser = xcUserMapper.selectOne(new LambdaQueryWrapper<XcUser>()
.eq(XcUser::getUsername, username));
//用户不存在,返回null
if (xcUser == null){
return null;
}
//用户存在,拿到密码,封装成UserDetails,密码对比由框架进行
String password = xcUser.getPassword();
UserDetails userDetails = User.withUsername(username).password(password).authorities("read").build();
return userDetails;
}
}