欢迎大家加入我的github项目,一起学习,一起发展
---> 全栈工程师进阶学习站
---> 我的前端学习笔记
--->行业内最新最群的报告,工作日每日更新
分布式微服务专栏008(springboot中集成BCrypt密码加密& jjwt&自定义注解(拦截器))
项目地址 (欢迎交流)
https://github.com/xunyegege/Backend_development/tree/master/token
1.BCrypt密码加密
(1)加密算法介绍
任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。
有很多标准的算法比如SHA或者MD5,结合salt(盐)是一个不错的选择。 Spring Security
提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCrypt强
哈希方法来加密密码。
BCrypt强哈希方法 每次加密的结果都不一样。
(2)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 解决JDK版本过高的问题 大于8 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<!-- 解决JDK版本过高的问题-->
(3)配置
@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
public BCryptPasswordEncoder bcryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
(4)加密解密代码
加密
String newpassword = encoder.encode(admin.getPassword());//加密后的密码
解密判断(返回boolean类型,无法获得明文)
Boolean result=encoder.matches(password,admin.getPassword()) //源码 matches(CharSequence rawPassword(原密码), String encodedPassword(加密后的密码))
(5)SpringBoot项目下的小问题
项目跑起来后打开页面会让你输入账户密码,这是security自带的验证
密码会打印在控制台,如:Using default security password: 40016cca-8d5d-40ca-a4c8-ae6184c97856
账户是 user
(6)注册(service层)代码
@Autowired //使用前注入
private BCryptPasswordEncoder encoder;
@Override
public int register(User user) {
user.setPassword(encoder.encode(user.getPassword()));
return userMapper.insertSelective(user);
}
(7)登录验证(service层)代码
@Autowired //使用前注入
private BCryptPasswordEncoder encoder;
@Override
public User login(String userName, String password) {
User user = userMapper.selectByUserName(userName);
if (null !=user && encoder.matches(password,user.getPassword())){
return user;
}
return null;
}
(8)数据库实际效果
2.JJWT实现无状态登录
(1)JWT介绍
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用
户和服务器之间传递安全可靠的信息。
(2)JWT的组成
一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。
头部
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以
被表示成一个JSON对象。