这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。
在完成基础功能(在悟空数据集查找图片等等功能)后,来到进阶功能模块,就是基本的业务功能,登录、注册、注销,但我们认为还是要严格的流程,有个认证授权功能。而因为项目是前后端分离的项目,使用Vue+Spring Boot技术栈,所以需要使用到SpringSecurity + Jwt,接下来简单描述一下实现流程,如果讲得不对请指出,谢谢。
Jwt官网:jwt.io/#debugger
JWT由三部分组成,这些部分由点(.)分隔,分别是:头部(Header)、载荷(playload)、签名(signature)
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1、添加SpringSecurity、Jwt依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2、SecurityConfig类编写
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
public UserDetailsService userDetailsService(){
return new UserDetailsServiceImpl();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//关闭跨站请求防护
.csrf()
.disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)// 不通过session获取sessionContext;
.and()
.authorizeRequests()
.antMatchers("所有不需要拦截的接口").permitAll()//不拦截这些路径
.anyRequest().authenticated();
}
}
3、编写MyUserDetailsService实现UserDetailsService
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserDao userDao;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
//进行认证操作
}
}
4、接下来是比较基本的操作
认证完成后,使用Jwt生成token令牌,将它发送到前端并存储到浏览器的Local Storage中和存储到redis中。此操作是说明登录以后,生成指定时间的token令牌在redis中,每次进行修改操作前需要先检查redis里的token令牌是否还存在,如果不存在,返回失败信息,否则,继续接下来的操作。
Jwt不仅可以用于认证,也可以用于交换信息。有效使用Jwt和Redis,可以降低服务器查询数据库的次数,加快运行速度并提升用户使用系统的体验。