任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比如SHA
或者MD5,结合salt(盐)是一个不错的选择。 Spring Security提供了BCryptPasswordEncoder类,实现Spring的
PasswordEncoder接口使用BCrypt强哈希方法来加密密码。
BCrypt强哈希方法 每次加密的结果都不一样。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐security</artifactId>
</dependency>
在添加spingsecurity依赖后,所有的地址都被SpringSecurity所控制,我们暂时只需要使用到BCrypt的密码加密部分,所以我们要添加配置类,让所有的地址都能够匿名访问。
package com.liu.user.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* 让所有的连接都能够被访问,所有的请求都是被认真,关闭csrf
*/
@Configuration
@EnableWebSecurity
public class WebSecurtyConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
添加BCryptPasswordEncoder 的声明,这样我们需要的密码加密类,就放到注册到容器里了
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
public void addUser(User user, String code) {
String syscode = (String) redisTemplate.boundHashOps(RedisKeyEnum.CAPTCHA_CODE.getKey()).get(user.getMobile());
if (syscode ==null){
throw new RuntimeException("请点击获取短信验证码");
}
if(!syscode.equals(code)){
throw new RuntimeException("您输入的验证码不正确,请确认后重新输入");
}
user.setId(idWorker.nextId()+"");
user.setPassword(encoder.encode(user.getPassword()));
userDao.save(user);
}
public User findByMobileAndPassword(String mobile,String password){
User user = userDao.findByMobile(mobile);
if(user!=null && encoder.matches(password,user.getPassword())){
return user;
}else {
return null;
}
}