Spring Security 认证授权流程以及过滤器链

一、Spring Security简介

Spring Security是一个安全框架,主要的核心功能认证和授权。

二、SecurityFilterChain 过滤器链

Spring Security 中,认证、授权都是基于 SecurityFilterChain(过滤器链) 完成的。一个请求认证或授权时都会先进入到 SecurityFilterChain 中,一个服务中有多个 SecurityFilterChain ,每个SecurityFilterChain 由 FilterChainProxy 管理,FilterChainProxy 根据不同请求url会 matches(匹配) 方法来确定满足条件 SecurityFilterChain 进入。FilterChainProxy 的生命周期方法会委托给DelegatingFilterProxy 来执行。而 DelegatingFilterProxy 的作用是将 Filter 容器化。

  • WebSecurity和HttpSecurity都是建造者
  • WebSecurity构建目标是FilterChainProxy对象
  • HttpSecurity的构建目标仅仅是FilterChainProxy中的一个SecurityFilterChain。
  • @EnableWebSecurity注解,导入了WebSecurityConfiguration类
  • WebSecurityConfiguration中创建了建造者对象WebSecurity,和核心过滤器FilterChainProxy
三、认证授权

SpringSecurity 表单认证时序图
在这里插入图片描述

SpringSecurityOAuth2 认证流程图
在这里插入图片描述

Spring Security 中的认证工作主要由 AuthenticationManager 接口来负责,该接口中只有一个 authenticate 方法用来做认证,返回 Authentication 对象表示认证成功。AuthenticationManager 最主要的实现类是 ProviderManager,ProviderManager 管理了众多的 AuthenticationProvider,AuthenticationProvider 中不仅有 authenticate 方法,还多了一个 supports 方法用来判断是否支持给定的 Authentication 类型。

认证授权的流程:

  1. SecurityContextPersistenceFilter:主要用来持久化 SecurityContext,请求进来时,首先取出已经持久化的SecurityContext对象(如果没有则为null),并将其设置到SecurityContextHolder对象中,等后续的过滤器执行完后再将其从SecurityContextHolder中清除。
  2. UsernamePasswordAuthenticationFilter:账号密码认证方式,我们知道真实的认证是在AuthenticationProvider 接口中认证的,账号密码认证方式使用的 DaoAuthenticationProvider 来实现 AuthenticationProvider 接口的,DaoAuthenticationProvider 在认证中根据 username 拿到 UserDetails对象(接口),该接口一般由我们自己去实现,里面存放的是用户的信息密码以及权限等,然后 调用 createSuccessAuthentication(UserDetails)方法获取一个已认证的 Authentication对象。这个对象会放在 SecurityContext 中在请求上下文中使用。
  3. OAuth2AuthenticationProcessingFilter:使用OAuth2时,资源认证服务才会有此过滤器。验证token使用的是 ResourceServerTokenServices 对象接口 调用 loadAuthentication(token) 方法验证token的, ResourceServerTokenServices 是个接口实现类是RemoteTokenServices,该类实际上使用restTemplate远程调用认证服务器来校验token的,最后得到一个 Authentication 对象放到 SecurityContext 中。此处资源服和认证服务都是内服自己的服务时可以自己实现 ResourceServerTokenServices 接口,减少远程调用,增加token校验性能。
  4. ExceptionTranslationFilter:用来转换整个链路中出现的异常,转换本身并不处理异常。一般只处理两大类异常:AccessDeniedException 访问异常和 AuthenticationException 认证异常
  5. FilterSecurityInterceptor:过滤器链中最后一个过滤器,主要用鉴权。该过滤器调用 AccessDecisionManager 接口 decide 方法,鉴权不成功会直接抛异常,成功则返回一个InterceptorStatusToken
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 是一个用于身份验证和授权的强大架。它提供了一套完整的认证授权流程,以下是 Spring Security认证授权流程: 1. 用户提交登录请求,服务器接收到请求后,进入认证过滤器。该过滤器由多个过滤器组成。 2. 过滤器中的第一个过滤器是 UsernamePasswordAuthenticationFilter,它负责处理基于用户名和密码的认证方式。该过滤器将用户提交的用户名和密码封装到一个 Authentication 对象中。 3. 过滤器中的下一个过滤器是 AuthenticationManager,它是 Spring Security 的核心接口。AuthenticationManager 负责验证 Authentication 对象的有效性。它会委托给一个或多个 AuthenticationProvider 来进行具体的认证操作。 4. AuthenticationProvider 是 AuthenticationManager 的实现类,它负责具体的认证逻辑。Spring Security 提供了多个内置的 AuthenticationProvider 实现,如 DaoAuthenticationProvider(使用数据库进行认证)、LdapAuthenticationProvider(使用 LDAP 进行认证)等。开发者也可以自定义 AuthenticationProvider。 5. 在认证过程中,AuthenticationProvider 会根据用户提供的凭证(如用户名和密码)进行认证,并生成一个经过认证的 Authentication 对象。 6. 当 AuthenticationProvider 认证成功后,Authentication 对象将被返回给 AuthenticationManager,并最终返回给 UsernamePasswordAuthenticationFilter。 7. 在认证成功后,UsernamePasswordAuthenticationFilter 会生成一个包含用户身份信息的 Authentication 对象,并将其存储在 Spring Security 的上下文中。 8. 接下来,授权过滤器会根据请求的 URL 和用户的权限信息,决定是否允许用户访问该资源。授权过滤器由多个过滤器组成,其中最重要的是 AccessDecisionManager 和 AccessDecisionVoter。 9. AccessDecisionManager 是授权决策的核心接口,它负责根据用户的权限信息和资源的访问要求,决定是否允许用户访问该资源。AccessDecisionManager 可以配置多个 AccessDecisionVoter,用于进行具体的授权决策。 10. AccessDecisionVoter 是 AccessDecisionManager 的实现类,它是授权决策的具体实现。Spring Security 提供了多个内置的 AccessDecisionVoter 实现,如 RoleVoter(基于角色的授权)、AuthenticatedVoter(基于认证状态的授权)等。开发者也可以自定义 AccessDecisionVoter。 以上就是 Spring Security认证授权流程。它通过一系列的过滤器和接口来实现用户认证和资源授权的功能,保障了应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值