一、修改密码编码器
以BCryptPasswordEncoder
举例。
直接将其注册成PasswordEncoder
的Bean
即可。
language-java1 2 3 4 5 6 7 8
| @Bean public PasswordEncoder passwordEncoder() { // 密码为明文方式 // return NoOpPasswordEncoder.getInstance(); // 或使用 BCryptPasswordEncoder return new BCryptPasswordEncoder(); }
|
二、效果
使用了加密算法后,无论是RegisteredClient
的密码还是UserDetailsService
的密码,都会以密文的方式存储在服务器上。
但是前端输入的密码仍然是以明文
的方式出现并传到服务器,之后服务器会对明文进行相同的手段(指对同样的明文,密文相同)加密,比较两个密文是否一致。
三、注意点
1. RegisteredClient
language-java1 2 3 4 5 6 7 8 9
| @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密文。
language-java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @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; } }
|