SpringSecurity代码实现JWT接口权限授予与校验


SpringSecurity代码实现JWT接口权限授予与校验

SpringSecurity代码实现JWT接口权限授予与校验


通过笔者前两篇文章的说明,相信大家已经知道JWT是什么,怎么用,该如何结合Spring Security使用。那么本节就用代码来具体的实现一下JWT登录认证及鉴权的流程。为了大部分的移动端用户观看,本文所有代码均用图片的形式发布,图片点击可放大。有需要源码的朋友可以call我。

一、环境准备工作

  • 建立Spring Boot项目并集成了Spring Security,项目可以正常启动
  • 通过controller写一个HTTP的GET方法服务接口,比如:“/hello”
  • 实现最基本的动态数据验证及权限分配,即实现UserDetailsService接口和UserDetails接口。这两个接口都是向Spring Security提供用户、角色、权限等校验信息的接口
  • 如果你学习过Spring Security的formLogin登录模式,请将HttpSecurity配置中的formLogin()配置段全部去掉。因为JWT完全使用JSON接口,没有from表单提交。
  • HttpSecurity配置中一定要加上csrf().disable(),即暂时关掉跨站攻击CSRF的防御。这样是不安全的,我们后续章节再做处理。

以上的内容,我们在之前的文章中都已经讲过。如果仍然不熟悉,可以翻看本号之前的文章。

二、开发JWT工具类

通过maven坐标引入JWT工具包jjwt


SpringSecurity代码实现JWT接口权限授予与校验

图片:JWT工具包maven坐标


在application.yml中加入如下自定义一些关于JWT的配置

jwt:   header: JWTHeaderName  secret: aabbccdd   expiration: 3600000 

写一个Spring Boot配置自动加载的工具类。


SpringSecurity代码实现JWT接口权限授予与校验

图片:开发JWT工具类


上面的代码就是使用io.jsonwebtoken.jjwt提供的方法开发JWT令牌生成、刷新的工具类。

三、开发登录接口(获取Token的接口)


SpringSecurity代码实现JWT接口权限授予与校验

图片:开发登录接口(获取Token的接口)


核心的token业务逻辑写在JwtAuthService 中


SpringSecurity代码实现JWT接口权限授予与校验

图片:核心的token业务逻辑写在JwtAuthService 中


因为使用到了AuthenticationManager ,所以在继承
WebSecurityConfigurerAdapter的SpringSecurity配置实现类中,将AuthenticationManager 声明为一个Bean。并将"/authentication"和 "/refreshtoken" 开放访问权限,如何开放访问权限,我们之前的文章已经讲过了。

@Bean(name = BeanIds.AUTHENTICATION_MANAGER) @Override public AuthenticationManager authenticationManagerBean() throws Exception {  return super.authenticationManagerBean(); }

四、接口访问鉴权过滤器

当用户第一次登陆之后,我们将JWT令牌返回给了客户端,客户端应该将该令牌保存起来。在进行接口请求的时候,将令牌带上,放到HTTP的header里面,header的名字要和jwt.header的配置一致,这样服务端才能解析到。下面我们定义一个拦截器:


SpringSecurity代码实现JWT接口权限授予与校验

图片:接口访问鉴权过滤器


在spring Security的配置类(即
WebSecurityConfigurerAdapter实现类的configure(HttpSecurity http)配置方法中,加入如下配置:

.sessionManagement()  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)  .and() .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); 

五、PostMan测试一下:

测试登录接口,即:获取token的接口。输入正确的用户名、密码即可获取token。

SpringSecurity代码实现JWT接口权限授予与校验

图片:测试登录接口


下面我们访问一个我们定义的简单的接口“/hello”,但是不传递JWT令牌,结果是禁止访问。当我们将上一步返回的token,传递到header中,就能正常响应hello的接口结果。

SpringSecurity代码实现JWT接口权限授予与校验

图片:访问接口“/hello”

springsecurity Spring Security实现JWT spring接口权限
分享到:

您可能还会对下面的文章感兴趣: