文章目录
- 一、修改密码编码器
- 二、效果
- 三、注意点
- 1. RegisteredClient
- 2. UserDetailsService
一、修改密码编码器
以BCryptPasswordEncoder
举例。
直接将其注册成PasswordEncoder
的Bean
即可。
@Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式
// return NoOpPasswordEncoder.getInstance();// 或使用 BCryptPasswordEncoderreturn new BCryptPasswordEncoder();}
二、效果
使用了加密算法后,无论是RegisteredClient
的密码还是UserDetailsService
的密码,都会以密文的方式存储在服务器上。
但是前端输入的密码仍然是以明文
的方式出现并传到服务器,之后服务器会对明文进行相同的手段(指对同样的明文,密文相同)加密,比较两个密文是否一致。
三、注意点
1. RegisteredClient
@Beanpublic 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 {@AutowiredXcUserMapper xcUserMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据username查询数据库XcUser xcUser = xcUserMapper.selectOne(new LambdaQueryWrapper<XcUser>().eq(XcUser::getUsername, username));//用户不存在,返回nullif (xcUser == null){return null;}//用户存在,拿到密码,封装成UserDetails,密码对比由框架进行String password = xcUser.getPassword();UserDetails userDetails = User.withUsername(username).password(password).authorities("read").build();return userDetails;}
}