Springboot整合SpringSecurity和jwt的权限认证流程实现

Springboot整合SpringSecurity和jwt的权限认证流程实现

1、springsecurity的流程图架构

注:高亮的部分都需要我们去实现
在这里插入图片描述在这里插入图片描述

流程说明

1、我们在整合进springsecurity的jar包之后,客户端发起的每一个请求,都会进入Security过滤器链

2、当用户请求进入过滤器链中首先会在logoutFilter判断是否是登录出操作,如果是则跳转进logoutHandler的登出处理器,如果登出成功则会进入LogoutSuccessHandler,同时会帮我们删除用户通过springsecurity登录成功后保存在springContextHolder的内容上下文主体。如果不是登出请求则继续走过滤器链。

3、接下来会判断是否是登录操作,我们在UsernamePasswordAuthenitcationFilter之前添加了验证码过滤器,所以向后端发起除了登出请求之外的任何请求都会跳转到验证码过滤器。在登录页中会通过异步请求拿到验证码图片,这个异步请求也会跳转到验证码过滤器,在通过HttpServletRequest获取的请求的uri,判断是否是登录请求,如果不是则放行,前端就能顺利拿到验证码。在判断URI是login时,就会进行验证码校验,具体的校验过程我在后面的用户验证码登录会说到,通过验证码校验通过后就会跳转进UsernamePasswordAuthenitcationFilter,进行认证,认证成功则跳转进认证成功处理器。
在这里插入图片描述
4、在原本的SpringSecurity中登录成功跳转的认证成功处理器是会为我们返回JSESSIONID,并放置在Cookies中,但是我们这个项目是前后端分离项目,不存在Session会话,所以需要去重写认证成功处理器。重写的认证成功处理器在首次登陆时会根据用户名生成一个jwt并放置返回请求头中,并返回统一结果中succ方法返回登录成功的信息。如果认证失败,则会跳转进认证失败过滤器并通过返回统一结果中的fail方法返回错误信息。

5、用户在登录成功之后,在用户界面的每一个向后端发起的操作,都会进入BasicAuthenticationFilter,由于我们是结合了jwt来进行权限认证操作,所以这里我们继承重新了BasicAuthentiactionFilter类,也就是在JwtAuthenticationFilter中进行权限认证,在前端登录之后向后端发出的请求头都需要携带jwt,在进入权限认证时,通过从请求头中获取到的jwt进行解析,如果认证通过,会做以下两个动作:一是通过jwt中有效载荷信息中获取用户名,在通过用户名查询出用户的权限信息,保存在springContextHolder完成用户自动登录,在之后的controller方法处理请求时如果需要用到用户名或者用户,就可以直接使用。

6、如果在JwtAuthenticationFilter认证失败就会跳转到AuthenticationEntryPoint认证失败处理类,在这里返回用户的错误信息。

7、在通过BasicAuthenticationFilter的继承类JWTAuthenticationFilter的jwt认证后,就会进入FilterSecurityInterceptor,在这个类中会去获取请求的uri,根据 uri 去找对应的鉴权管理器,鉴权管理器做鉴权工作,我们会在每个需要请求权限的controller类的方法上添加认证注解,鉴权成功则到 Controller 层,否则到 AccessDeniedHandler 鉴权失败处理器处理。
在这里插入图片描述

2、导入依赖jar包

<!-- springboot security -->
<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>
<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>
<!-- hutool工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.3.3</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>

3、启动测试

在这里插入图片描述
初始化用户名为root,密码在项目启动的时候就为我们定义好了
后台会话,在认证成功处理器默认给我们前端返回了一个cookie,在每次请求中都会携带这个cookie
在这里插入图片描述
注意:我们这个项目时前后端分离的项目,我们会去自定义认证成功处理器,是没有cookie会话处理的,都是使用本地缓存,使用token放在我们的请求头里

4、修改配置用户名和密码

因为每次启动密码都会改变,所以我们通过配置文件来配置一下默认的用户名和密码:
注意:我在springboot中的配置文件使用的是yml格式

spring:
  security:
    user:
      name: user
      password: 111111

猜你喜欢

转载自blog.csdn.net/weixin_46195957/article/details/117366765
今日推荐