四、Spring Boot集成Spring Security之认证流程

乌市泽哥  金牌会员 | 2024-10-14 11:07:36 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 895|帖子 895|积分 2685

二、概要说明


  • 本文紧张介绍登录登出业务流程,所以使用基于内存的用户名暗码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权
  • 怎样查看基于内存的默认用户名暗码
  • 怎样设置基于内存的自定义用户名暗码
  • 本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同砚,请先查看三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
三、基于内存的用户名暗码

1、默认用户名暗码



  • 用户名暗码源码

2、自定义用户名暗码


  • 上一小节【用户名暗码源码】中设置绑定可以设置自定义用户名、暗码
  • 通过设置文件设置用户名暗码

3、为方便测试添加测试接口TestController
  1. package com.yu.demo.web;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. @RequestMapping("/test")
  7. public class TestController {
  8.     @GetMapping("/hello")
  9.     public String hello() {
  10.         return "success";
  11.     }
  12. }
复制代码

四、登录登出紧张概念介绍


  • 安全上下文堆栈(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
  • 安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
  • 安全上下文(SecurityContext):用于存储认证信息
  • 认证信息(Authentication):用于存储用户及认证结果信息,紧张实现类有

    • 用户名暗码认证Token:UsernamePasswordAuthenticationToken
    • 匿名认证Token:AnonymousAuthenticationToken

  • 登录页面请求:跳转到登录页面的请求
  • 登录请求:在登录页面输入用户名暗码后提交的请求
  • 登出页面请求:跳转到登出页面的请求
  • 登出请求:在登出页面确认登出提交的请求
五、登录业务逻辑

1、登录业务相关过滤器


  • SecurityContextPersistenceFilter
  • UsernamePasswordAuthenticationFilter
  • DefaultLoginPageGeneratingFilter
  • AnonymousAuthenticationFilter
  • ExceptionTranslationFilter
  • FilterSecurityInterceptor
2、访问业务请求处理流程

1)、访问业务请求地点被拦截,重定向到登录页面请求


  • 欣赏器访问业务请求地点:http://localhost:8080/test/hello
  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码


  • AnonymousAuthenticationFilter处理请求:

    • 获取安全上下文持有者中的安全上下文中的认证信息为空
    • 创建匿名认证信息
    • 创建新的没有认证信息的安全上下文
    • 将第2步中的匿名认证信息设置到第3步中的安全上下文中
    • 将第3步中的安全上下文中设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码


  • FilterSecurityInterceptor处理请求:

    • 验证安全上下文持有者中的安全上下文中的匿名认证信息通过
    • 验证授权信息失败(业务请求地点未设置可以匿名访问时),抛出AccessDeniedException异常
    • 源码


  • ExceptionTranslationFilter处理请求:

    • 捕获FilterSecurityInterceptor抛出的AccessDeniedException异常
    • 判断是由于匿名访问导致的授权异常
    • 创建新的没有认证信息的安全上下文
    • 将第3步中的安全上下文中设置到安全上下文持有者中
    • 重定向到登录页面:http://localhost:8080/login
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码


  • 重定向登录页面请求:http://localhost:8080/login(GET)
2)、重定向定页面请求,返回登录页面


  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码(同上)

  • DefaultLoginPageGeneratingFilter处理请求:

    • 判断是跳转到登录页面的请求
    • 生成默认登录页面
    • 返回并渲染生成的默认登录页面
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码(同上)

3)、输入正确用户名暗码,重定向到业务请求


  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取安全上下文为空,创建没有认证信息的安全上下文(SecurityContextImpl)
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码(同上)

  • UsernamePasswordAuthenticationFilter处理请求:

    • 判断需要认证(AbstractAuthenticationProcessingFilter.doFilter方法)
    • 认证用户名暗码乐成,生成已认证的认证信息UsernamePasswordAuthenticationToken
    • 创建新的没有认证信息的安全上下文
    • 将第2步中的认证信息设置到第3步中的安全上下文中
    • 将第3步中的安全上下文设置到安全上下文持有者中
    • 将第3步中的安全上下文保存到局部变量安全上下文堆栈中(空实现)
    • 重定向到业务请求地点:http://localhost:8080/test/hello
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码(同上)

4)、重定向到业务请求


  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取已认证的安全上下文
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码(同上)

  • FilterSecurityInterceptor处理请求:

    • 验证安全上下文持有者中的安全上下文中的认证信息通过
    • 验证授权乐成
    • 调用接口返回数据
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码(同上)

六、登出业务实现逻辑

1、登出业务相关过滤器


  • SecurityContextPersistenceFilter
  • LogoutFilter
  • DefaultLogoutPageGeneratingFilter
2、访问登出页面请求处理流程


  • 欣赏器访问登出请求地点:http://localhost:8080/logout
  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取已认证的安全上下文
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码(同上)

  • DefaultLogoutPageGeneratingFilter处理请求:

    • 判断是跳转到登出页面的请求
    • 生成默认登出页面
    • 返回并渲染生成的默认登出页面
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码(同上)

3、登出页面确认登出请求处理流程

1)、确认登出,重定向到登录页面请求


  • SecurityContextPersistenceFilter处理请求:

    • 从安全上下文堆栈中获取已认证的安全上下文
    • 将第1步中获取的安全上下文设置到安全上下文持有者中
    • 实验后续过滤器链
    • 源码(同上)

  • LogoutFilter处理请求:

    • 判断是登出请求
    • 获取安全上下文持有者中的安全上下文
    • 登出处理器处理登出业务

      • 删除安全上下文持有者中的安全上下文
      • 创建没有认证信息的安全上下文
      • 将第2步中的安全上下文保存到安全上下文堆栈中

    • 重定向到登录页面
    • 源码


  • SecurityContextPersistenceFilter处理请求:

    • 实验chain.doFilter之后的代码
    • 获取安全上下文持有者中的安全上下文
    • 删除安全上下文持有者中的安全上下文
    • 将第2步中获取的安全上下文保存到安全上下文堆栈中
    • 源码(同上)

2)、登录页面请求

第五节登录业务逻辑已介绍,不再赘述。
七、说明


  • Spring Boot集成Spring Security默认是非前后分离架构
  • 本文介绍的流程是非前后分离版本的处理流程
  • 前后分离处理流程较为简单

    • 未认证时访问业务接口,返回未认证错误信息
    • 调用登录接口乐成后返回Token,此后请求头中携带此Token
    • 调用登出接口乐成后返回乐成,后端将该Token失效
    • 携带Token访问业务接口,后端验证Token乐成后,调用业务接口并返回数据


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表