Spring Security (权限访问流程 + 源码分析)

Spring Security (权限访问流程 + 源码分析) ,第1张

文章目录
      • 1. SpringSecurity 的过滤器介绍
      • 2.SpringSecurity 基本流程
      • 3.Spring Security 权限访问流程

1. SpringSecurity 的过滤器介绍

SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过器链的 15 个过滤器进行说明:

  1. WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。

  2. SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信息就是这个过滤器处理的。

  3. HeaderWriterFilter:用于将头信息加入响应中。

  4. CsrfFilter:用于处理跨站请求伪造。

  5. LogoutFilter:用于处理退出登录。

  6. UsernamePasswordAuthenticationFilter:用于处理基于表单的登录请求,从表单中获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改。7. DefaultLoginPageGeneratingFilter:如果没有配置登录页面,那系统初始化时就会配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。

  7. BasicAuthenticationFilter:检测和处理 http basic 认证。

  8. RequestCacheAwareFilter:用来处理请求的缓存。

  9. SecurityContextHolderAwareRequestFilter:主要是包装请求对象 request。

  10. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  11. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  12. AnonymousAuthenticationFilter:检测 SecurityContextHolder 中是否存在Authentication 对象,如果不存在为其提供一个匿名 Authentication。

  13. FilterSecurityInterceptor:可以看做过滤器链的出口。

  14. RememberMeAuthenticationFilter:当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。

2.SpringSecurity 基本流程

Spring Security 采取过滤链实现认证与授权,只有当前过滤器通过,才能进入下一个
过滤器

绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以
使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:短信验证)。认
证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效。下面会重
点介绍以下三个过滤器:

  • UsernamePasswordAuthenticationFilter: 该过滤器会拦截前端提交的 POST 方式
    的登录表单请求,并进行身份认证。
  • ExceptionTranslationFilter 过滤器:该过滤器不需要我们配置,对于前端提交的请求会
    直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。
  • FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源
    权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并
    由 ExceptionTranslationFilter 过滤器进行捕获和处理。
3.Spring Security 权限访问流程
  • ExceptionTranslationFilter 过滤器:该过滤器不需要我们配置,对于前端提交的请求会直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。
  • FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并由 ExceptionTranslationFilter 过滤器进行捕获和处理。

ExceptionTranslationFilter#doFilter()

对于前端提交的请求会直接放行,捕获后续抛出的异常并进行处理


FilterSecurityInterceptor#doFilter()

根据资源权限配置来判断当前请求是否有权限访问对应的资源。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/923326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存