任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。
有很多标准的算法比如
SHA
或者
MD5
,结合
salt(
盐
)
是一个不错的选择。
实现Spring
的
PasswordEncoder
接口使用
BCrypt
强
哈希方法来加密密码。
BCrypt
强哈希方法 每次加密的结果都不一样。
@SpringBootTest
class ApplicationTests {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Test
public void testBCryptPasswordEncoder() {
for (int i = 0; i < 10; i++) {
String password = “123456”;
String hashed = bCryptPasswordEncoder.encode(password);
System.out.println(hashed);
}
}
}
加密后的密码长度为60(所以设计数据库时得保证该字段长度不小于60)
(
1
)
工程的
pom
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</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();
}
}
(三)启动类中配置bean
@Bean
public BCryptPasswordEncoder getBcryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
(四)加密密码
// 加密密码
user.setPassword(bCryptPasswordEncoder.encode(password));
五)校验密码
// 参数一:待检验的、未加密的密码
// 参数二:从数据库中查询出的加密后密码
bCryptPasswordEncoder.matches(password, userFromDB.getPassword())
/**
*
根据手机号和密码查询用户
* @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
;
}
}