Bcrypt密碼加密
1.1 簡介
任何應用考慮到安全,絕不能明文的方式保存密碼。密碼應該通過哈希算法進行加密。有很多標準的算法比如SHA或者MD5,結salt(鹽)是一個不錯的選擇。 Spring Security提供了BCryptPasswordEncoder類,實現Spring的PasswordEncoder接口使用BCrypt強哈希方法來加密密碼。
BCrypt強哈希方法 每次加密的結果都不一樣。
(1)工程中引入依賴
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
(2)添加配置類
我們在添加了spring security依賴後,所有的地址都被spring security所控制了,我們目前只是需要用到BCrypt密碼加密的部分,所以我們要添加一個配置類,配置爲所有地址都可以匿名訪問。
/**
* 安全配置類
*/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
(3)修改r工程的Application, 配置bean
@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
1.2 管理員密碼加密
1.2.1 新增管理員密碼加密
@Autowired
BCryptPasswordEncoder encoder;
public void add(Admin admin) {
admin.setId(idWorker.nextId()+""); //主鍵值
//密碼加密
String newpassword = encoder.encode(admin.getPassword());//加密後的密碼
admin.setPassword(newpassword);
adminDao.save(admin);
}
1.2.2 管理員登陸密碼校驗
(1)AdminDao增加方法定義
public Admin findByLoginname(String loginname);
(2)AdminService增加方法
/**
* 根據登陸名和密碼查詢
* @param loginname
* @param password
* @return
*/
public Admin findByLoginnameAndPassword(String loginname, String password){
Admin admin = adminDao.findByLoginname(loginname);
if( admin!=null && encoder.matches(password,admin.getPassword()))
{
return admin;
}else{
return null;
}
}
(3)AdminController增加方法
/**
* 用戶登陸
* @param loginname
* @param password
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
public Result login(@RequestBody Map<String,String> loginMap){
Admin admin = adminService.findByLoginnameAndPassword(loginMap.get("loginname"),
loginMap.get("password"));
if(admin!=null){
return new Result(true,StatusCode.OK,"登陸成功");
}else{
return new Result(false,StatusCode.LOGINERROR,"用戶名或密碼錯誤");
}
}
1.3 用戶密碼加密
1.3.1 用戶註冊密碼加密
(4)修改tensquare_user工程的UserService 類,引入BCryptPasswordEncoder
@Autowired
private BCryptPasswordEncoder encoder;
(5)修改tensquare_user工程的UserService 類的add方法,添加密碼加密的邏輯
/**
* 增加
* @param user
* @param code
*/
public void add(User user,String code) {
........
........
........
//密碼加密
String newpassword = encoder.encode(user.getPassword());//加密後的密碼
user.setPassword(newpassword);
userDao.save(user);
}
(4)測試運行後,添加數據
{
"mobile": "13901238899",
"password": "123123"
}
數據庫中的密碼爲以下形式
$2a$10$a/EYRjdKwQ6zjr0/HJ6RR.rcA1dwv1ys7Uso1xShUaBWlIWTyJl5S
1.3.2 用戶登陸密碼判斷
(1)修改tensquare_user工程的UserDao接口,增加方法定義
/**
* 根據手機號查詢用戶
* @param mobile
* @return
*/
public User findByMobile(String mobile);
(2)修改tensquare_user工程的UserService 類,增加方法
/**
* 根據手機號和密碼查詢用戶
* @param mobile
* @param password
* @return
*/
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;
}
}
(4)修改tensquare_user工程的UserController類,增加login方法
/
**
* 用戶登陸
* @param mobile
* @param password
* @return
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
public Result login(String mobile,String password){
User user = userService.findByMobileAndPassword(mobile,password);
if(user!=null){
return new Result(true,StatusCode.OK,"登陸成功");
}else{
return new Result(false,StatusCode.LOGINERROR,"用戶名或密碼錯誤");
}
}
(4)使用剛纔新增加的賬號進行測試,查看返回結果