SpringSecurity Jwt | 青训营笔记

165 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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,可以降低服务器查询数据库的次数,加快运行速度并提升用户使用系统的体验。