SpringSecurity的几个核心过滤器链

废话不多说,上图:

流程如图所示,不在废话,如果不清楚,请看汉字加箭头!!!

以下分别对几个过滤器链进行介绍:

1,Security Context Persistence Filter(安全上下文持久性过滤器):

负责在请求开始时加载用户的安全上下文(加载进SecurityContextHolder),并在请求结束时将其保存会HttpSession中;

安全上下文:定义用户或者进程在特定的环境或者框架下允许执行哪些操作和访问哪些资源的许可和权限的集合。

作用与功能

1,恢复与保存安全上下文:
	当请求到达时,SecurityContextPersistenceFilter 会从 HTTP 请求中(通常是 HttpSession)恢复用户的安全上下文(SecurityContext),并将其存入 SecurityContextHolder 中。
	当请求处理完成后,它会将 SecurityContextHolder 中的安全上下文保存到 HTTP 响应中(通常是 HttpSession),以便在后续请求中恢复。
2,保持用户登录状态:
	通过这种方式,用户在跳转到另一个页面或在浏览器中打开另一个标签页时,仍然可以保持登录状态。
3,在过滤器链中的位置:
	SecurityContextPersistenceFilter 通常位于 Spring Security 过滤器链的最前面,因为它需要在其他过滤器执行之前恢复用户的安全上下文。

工作流程:

请求过来时:

        从HttpSession中获取SecurityContext(如果存在);

        将获取的SecurityContext存入SecurityContextHolder中;

请求处理过程中:
    其他过滤器(如 UsernamePasswordAuthenticationFilter、LogoutFilter 等)可能会修改SecurityContextHolder 中的 SecurityContext。

请求处理完毕后:
        从 SecurityContextHolder 中获取 SecurityContext;

        将 SecurityContext 保存到 HttpSession 中;

        清空 SecurityContextHolder 中的内容,确保不会造成内存泄漏。


 2,Username Password Authentication Filter(用户名密码认证过滤器)

监听请求,接受用户账号密码等凭证,封装对象,委托代理访问数据库进行数据信息校验

定义与功能:

        1,Username Password Authentication Filter是Spring Security提供的默认身份验证过滤器,它负责监听POST请求的"/login"路径,接收用户提交的用户名和密码等凭证。
        2,过滤器接收到请求后,会将用户名和密码等凭证封装为一个UsernamePasswordAuthenticationToken对象,然后将其传递给AuthenticationManager进行身份验证。

工作流程:

        1,当用户提交登录表单时,Username Password Authentication Filter会捕获这个POST请求。
过滤器从请求中获取用户名和密码,并创建一个UsernamePasswordAuthenticationToken对象,该对象包含了用户的认证信息。
        2,然后,过滤器将UsernamePasswordAuthenticationToken对象传递给AuthenticationManager进行实际的身份验证。
        3,AuthenticationManager会委托给相应的AuthenticationProvider进行身份验证,比如通过查询数据库来验证用户提供的用户名和密码是否正确。
         4,如果身份验证成功,AuthenticationManager会返回一个包含用户信息和认证状态的Authentication对象。
        5,Username Password Authentication Filter会将这个Authentication对象保存到SecurityContextHolder中,以便后续的请求可以访问到用户的认证信息。

3,Basic Authentication filter(基本身份验证过滤器)

主要验证用户在访问受保护的资源时是否具备可以通过的凭证(例如从token中解析出的用户名和密码是否正确)

工作原理:

        1,用户凭据传递:在基本认证过程中,前端应用程序会将用户的凭据(用户名和密码)进行Base64编码,并将编码后的字符串添加到HTTP请求的Authorization头部中。

        2,解码与验证:Basic Authentication filter从HTTP请求的Authorization头部中解析出Base64编码的用户名和密码,并进行解码。然后,它会将这些凭据发送到AuthenticationManager进行身份验证。
        3,认证结果处理:
                认证成功:如果用户凭据验证通过,用户将获得访问受保护资源的权限,并且认证结果通常会被写入SecurityContextHolder中,以便后续使用。
                认证失败:如果用户凭据验证失败,用户将无法访问受保护的资源,并且SecurityContextHolder中的SecurityContext可能会被清除。此外,过滤器可能会抛出异常(如BadCredentialsException)来指示认证失败。

4,Exception Translation Filter(异常转换过滤器)

主要用于转换整个链路中出现的异常

主要处理两大类异常:AccessDeniedException(访问异常)和AuthenticationException(认证异常):

处理逻辑:

        进行异常判断,判断是否是SpringSecurity产生的异常,如果是,则进入handleSpringSecurityException(request, response, chain, ase)方法进行处理;否则,抛出ServletException/RuntimeException。

AuthenticationException处理:

        如果检测到AuthenticationException,则将其交给内部的AuthenticationEntryPoint去处理。AuthenticationEntryPoint的默认实现是LoginUrlAuthenticationEntryPoint,它会将用户重定向到登录页面。

AccessDeniedException处理:

        对于AccessDeniedException,首先需要判断当前用户是否为匿名用户:
如果是匿名用户,则和AuthenticationException一样,由AuthenticationEntryPoint处理,通常也是重定向到登录页面。
    如果是已认证用户,则交给AccessDeniedHandler去处理。AccessDeniedHandler的默认实现是AccessDeniedHandlerImpl。

5,FilterSecurityInterceptor(过滤器安全拦截器)

主要用于对请求进行鉴权;

        1. 主要功能

                权限判断:FilterSecurityInterceptor会对传入的HTTP请求进行权限判断,以确定用户是否具有访问该资源的权限。

                异常处理:如果权限判断失败,FilterSecurityInterceptor会抛出AccessDeniedException异常。

        2. 工作流程

                1,获取权限配置:FilterSecurityInterceptor会从配置好的SecurityMetadataSource中获取当前请求所对应的权限配置,即ConfigAttribute。

                2,权限验证:FilterSecurityInterceptor会调用AccessDecisionManager的decide方法对用户的权限进行验证。这个过程主要是比对请求所需的角色和用户已有的角色,如果匹配则允许访问,否则拒绝。

                3,异常处理:如果权限验证失败,FilterSecurityInterceptor会抛出AccessDeniedException异常。这个异常会被后续的ExceptionTranslationFilter捕获并处理。

        3. 关键点
                SecurityMetadataSource:负责提供请求所需的权限配置。通常可以通过配置文件的方式定义URL和角色之间的映射关系,也可以通过数据库等方式动态获取。
                AccessDecisionManager:负责执行权限验证的逻辑。它可以根据配置的规则(如角色、权限等)来判断用户是否具有访问资源的权限。
                ExceptionTranslationFilter:负责捕获并处理FilterSecurityInterceptor抛出的异常。它会根据异常的类型和配置来决定如何处理(如重定向到登录页面、显示错误信息等)。

        4. 自定义实现
                重写SecurityMetadataSource:如果需要从数据库中动态获取请求所需的权限配置,可以重写SecurityMetadataSource的实现。
                重写AccessDecisionManager:如果需要自定义权限验证的逻辑(如基于权限字符串的判断等),可以重写AccessDecisionManager的实现。

  • 31
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值