spring security的认证和授权流程

一.springsecurity的认证流程

1.1 常用过滤器

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

WebAsyncManagerIntegrationFilter

将 Security 上下文与 Spring Web 中用于

处理异步请求映射的 WebAsyncManager 进行集成

SecurityContextPersistenceFilter

在每次请求处理之前将该请求相关的安全上

下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将

SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将

SecurityContextHolder 中的信息清除,例如在 Session 中维护一个用户的安全信

息就是这个过滤器处理的。

HeaderWriterFilter

用于将头信息加入响应中

CsrfFilter

用于处理跨站请求伪造

LogoutFilter

用于处理退出登录

UsernamePasswordAuthenticationFilter

用于处理基于表单的登录请求,从表单中

获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码

时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个

过滤器的 usernameParameter 和 passwordParameter 两个参数的值进行修改

DefaultLoginPageGeneratingFilter

如果没有配置登录页面,那系统初始化时就会

配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。

BasicAuthenticationFilter

检测和处理 http basic 认证

RequestCacheAwareFilter

用来处理请求的缓存

SecurityContextHolderAwareRequestFilter

主要是包装请求对象 request

AnonymousAuthenticationFilter

检测 SecurityContextHolder 中是否存在

Authentication 对象,如果不存在为其提供一个匿名 Authentication

SessionManagementFilter

管理 session 的过滤器

ExceptionTranslationFilter

处理 AccessDeniedException 和

AuthenticationException 异常。

FilterSecurityInterceptor

可以看做过滤器链的出口

RememberMeAuthenticationFilter

当用户没有登录而直接访问资源时, 从 cookie

里找出用户的信息, 如果 Spring Security 能够识别出用户提供的 remember me cookie,

用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。

1.2 认证的宏观流程

Spring Security 采取过滤链实现认证与授权,只有当前过滤器通过,才能进入下一个过滤器绿色部分是认证过滤器,需要我们自己配置,可以配置多个认证过滤器。认证过滤器可以使用 Spring Security 提供的认证过滤器,也可以自定义过滤器(例如:短信验证)。认证过滤器要在 configure(HttpSecurity http)方法中配置,没有配置不生效

1.UsernamePasswordAuthenticationFilter 过滤器:该过滤器会拦截前端提交的 POST 方式的登录表单请求,并进行身份认证。

2.ExceptionTranslationFilter过滤器:该过滤器不需要我们配置,对于前端提交的请求直接放行,捕获后续抛出的异常并进行处理(例如:权限访问限制)。

3.FilterSecurityInterceptor 过滤器:该过滤器是过滤器链的最后一个过滤器,根据资源权限配置来判断当前请求是否有权限访问对应的资源。如果访问受限会抛出相关异常,并由 ExceptionTranslationFilter 过滤器进行捕获和处理。

从上图中可以看到Spring Security第一个拦截器是SecurityContextPersistenceFilter它主要存放用户的认证信息。然后进入第二个拦截器UsernamePasswordAuthenticationFilter它主要用来拦截Spring Security拦截用户密码表单登录认证使用默认,当发现请求是Post,请求地址是/login,且参数包含了username/password时,就进入了认证环节)。

1.3 代码详情分析

认证流程是在 UsernamePasswordAuthenticationFilter 过滤器中处理的,具体流程如下所示:

 

1.4 代码详情

后续补充,见sgg的pdf

二.springsecurity的授权流程

2.1 授权流程

授权主要涉及两个过滤器:ExceptionTranslationFilter 过滤器和 FilterSecurityInterceptor 过滤器。

2.1.1 ExceptionTranslationFilter 过滤器
该过滤器是用于 处理异常的,不需要我们配置,对于前端提交的请求会直接放行 ,捕获后
续抛出的异常并进行处理(例如:权限访问限制)。具体源码如下:

2.1.2 FilterSecurityInterceptor 过滤器 

FilterSecurityInterceptor 是过滤器链的最后一个过滤器 ,该过滤器是过滤器链的最后一个过滤器, 根据资源权限配置来判断当前请求是否有权限访问对应的资源 。如果访问受限会抛出相关异常,最终所抛出的异常会由 前一个过滤器ExceptionTranslationFilter 进行捕获和处理。

需要注意, Spring Security 的过滤器链是配置在 SpringMVC 的核心组件 DispatcherServlet 运行之前 。也就是说,请求通过 Spring Security 的所有过滤器, 不意味着能够正常访问资源 该请求还需要通过 SpringMVC 的拦截器链。

三 认证信息的共享存储

3.1 流程图

查 看 SecurityContext 接 口 及 其 实 现 类 SecurityContextImpl , 该 类 其 实 就 是 对
Authentication 的封装:
查 看 SecurityContextHolder 类 , 该 类 其 实 是 对 ThreadLocal 的 封 装 , 存 储
SecurityContext 对象

 流程:

在 UsernamePasswordAuthenticationFilter 过滤器认证成功之 后,会在认证成功的处理方法中将已认证的用户信息对象 Authentication 封装进 SecurityContext,并存入 SecurityContextHolder之后,响应会通过 SecurityContextPersistenceFilter 过滤器,该过滤器的位置在所有过滤器的最前面。

认证成功的响应通过 SecurityContextPersistenceFilter 过滤器时,会从 SecurityContextHolder 中取出封装了已认证用户信息对象 Authentication 的SecurityContext,放进 Session 中。当请求再次到来时,请求首先经过该过滤器,该过滤器会判断当前请求的 Session 是否存有 SecurityContext对象,如果有则将该对象取出再次放入 SecurityContextHolder 中,之后该请求所在的线程获得认证用户信息,后续的资源访问不需要进行身份认证;当响应再次返回时,该过滤器同样从 SecurityContextHolder 取出SecurityContext 对象,放入 Session 中。

 

  • 12
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Security是一个功能强大的身份验证和授权框架,用于保护Java应用程序的安全性。它提供了一套全面的认证授权机制,可以轻松地集成到Spring应用程序中。 Spring Security认证授权流程如下: 1. 用户提交登录请求:用户在前端页面输入用户名和密码,并提交登录请求。 2. 认证过滤器链:Spring Security通过一系列的过滤器链来处理认证请求。其中最重要的是UsernamePasswordAuthenticationFilter,它负责处理用户名和密码的认证。 3. 用户认证:UsernamePasswordAuthenticationFilter将用户名和密码传递给AuthenticationManager进行认证。AuthenticationManager是Spring Security的核心接口,负责处理认证请求。 4. 用户提供的凭据验证:AuthenticationManager使用用户提供的凭据(用户名和密码)与存储在系统中的凭据进行比较。通常情况下,凭据是存储在数据库中的加密密码。 5. 认证结果生成:如果凭据验证成功,AuthenticationManager将生成一个认证成功的Authentication对象,并将其返回。 6. 认证成功处理器:认证成功后,Spring Security会调用认证成功处理器(AuthenticationSuccessHandler),执行一些自定义的逻辑,例如生成并返回一个JWT令牌。 7. 生成令牌:如果需要生成令牌,可以使用TokenProvider来生成一个JWT令牌,并将其返回给客户端。 8. 授权过滤器链:一旦用户成功认证并获得令牌,后续的请求将被授权过滤器链处理。授权过滤器链会验证请求中的令牌,并根据令牌中的信息判断用户是否有权限访问资源。 9. 授权验证:授权过滤器链会验证令牌的有效性,并根据令牌中的角色和权限信息判断用户是否有权限访问请求的资源。 10. 授权结果处理:如果用户有权限访问资源,授权过滤器链会继续处理请求。否则,将返回一个未授权的错误响应。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值