• 【Spring Security 系列】(四)高层级组件


    前面两篇文章,我们已经把认证&授权功能的基础组件介绍了一遍,这里再来回顾一下:

    基础组件总结

    上文中提到的大部分都是接口,也就是 Spring Security 把各个问题都抽象成一个接口,可以自由的实现它,列举一下:

    • UserDetails – 用户信息抽象
    • GrantedAuthority – 权限信息抽象
    • UserDetailsService – 用户信息查询
    • PasswordEncoder – 密码加密与验证
    • AuthenticationSuccessHandler – 认证成功处理逻辑
    • AuthenticationFailureHandler – 认证失败处理逻辑
    • LogoutSuccessHandler – 登出成功处理逻辑
    • AccessDecisionVoter – 鉴权
    • AccessDeniedHandler – 权限不足处理逻辑
    • AuthenticationEntryPoint – 匿名访问处理逻辑

    还有三个Filter:

    • UsernamePasswordAuthenticationFilter – 登录接口,请求路径为 POST /login,请求字段为 usernamepassword
    • LogoutFilter – 登出接口,请求路径为 POST /logout
    • FilterSecurityInterceptor – 鉴权拦截器

    看起来说到这貌似可以完结了,UsernamePasswordAuthenticationFilter 直接就引用 UserDetailsService 和 PasswordEncoder 不就可以实现了用户认证吗?

    答:实现是实现了,但看起来有点像是硬编码了,扩展性堪忧。UserDetailsService+PasswordEncoder适用于自己系统管理账号密码的情况,那如果此时要同时接入别的认证系统,也就是支持多种认证方式,直接傻眼。
    之所以称为框架,就是它还考虑了各种各样的情形,看看 Spring Security 还藏了什么东西。

    更高层抽象

    上文提到的各个组件只是最底层的抽象而且是比较零散的,作为一个成熟的框架,势必会将各个组件有机的整合起来,提供更高层次的抽象。使得框架更易于使用且可以灵活扩展。
    来看看Spring Security做了哪些努力:

    1. Authentication
      身份验证的主体,会用于认证前的信息流转,也会用于承载认证后的认证主体信息(标记为已认证),认证后可通过 SecurityContextHolder.getContext().getAuthentication() 获取。内部会包含 UserDetails 和 GrantedAuthority。
    2. AuthenticationProvider
      认证提供者,用于执行特定类型的身份验证。内置实现有 DaoAuthenticationProvider,内部引用了 UserDetailsService 和 PasswordEncoder,用于支持用户名/密码的身份验证。
    3. AuthenticationManager
      认证管理者,认证逻辑对外暴露的高层接口。内置实现有 ProviderManager,内部可引用多个 AuthenticationProvider,支持多种认证实现。
    4. AccessDecisionManager
      鉴权管理者,鉴权逻辑对外暴露的高层接口。内置实现有 AffirmativeBased,内部可引用多个 AccessDecisionVoter,支持多种鉴权实现。

    end

  • 相关阅读:
    告别if else,试试这款轻量级流程引擎吧,自带IDEA插件真香
    IDEA的启动速度优化
    Linux用户和权限学习笔记
    搞了一个更完善的javaagent项目结构
    puppeteer实现网页截图
    Git明白人
    1.2 switch实现两个数的四则运算
    游戏开发30课 cocoscreator骨骼贴图布局设置
    鸿蒙HarmonyOS实战-Stage模型(进程模型)
    【nacos】5.3 nacos 更新mqtt配置,自动加载连接EMQX
  • 原文地址:https://blog.csdn.net/qq_31772441/article/details/126237976