Spring security学习笔记(二) | 青训营笔记

75 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

上节记录学习了Spring security的一些实现原理相关知识,本节继续基于此展开来进行记录学习。

  • 授权(Authorization)

    • AccessDecisionManager
      • 访问决策管理器,用于决定此次访问是否被允许
    • AccessDecisionVoter
      • 访问决定投票器,其会检查用户是否具备应有的角色,进而投出赞成、反对或者弃权票
      • 会被AccessDecisionManager逐个遍历,进而决定是否允许用户访问
    • ConfigAttribute
      • 用于保存授权时的角色信息
  • 实现原理

    • Spring Security如何做到仅引入一个依赖就能将我们的接口保护起来?
      • 认证、授权等功能都是基于过滤器完成的
      • 需要注意的是,默认过滤器并不是直接放在 Web 项目的原生过滤器链中,而是通过一个FlterChainProxy 来统一管理。Spring Security 中的过滤器链通过 FilterChainProxy 嵌入到Web项目的原生过滤器链中。FilterChainProxy 作为一个顶层的管理者,将统一管理 SecurityFilter。FilterChainProxy 本身是通过 Spring 框架提供的 DelegatingFilterProxy 整合到原生的过滤器链中。
    • Spring Security如何做到自动配置?
      • SpringBootWebSecurityConfiguration
        @Configuration(proxyBeanMethods = false)
        @ConditionalOnClass(WebSecurityConfigurerAdapter.class)
        @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
        @ConditionalOnWebApplication(type = Type.SERVLET)//条件:允许servlet类型
        public class SpringBootWebSecurityConfiguration {
        
           @Configuration(proxyBeanMethods = false)
           @Order(SecurityProperties.BASIC_AUTH_ORDER)
           static class DefaultConfigurerAdapter extends 
                WebSecurityConfigurerAdapter {                        
        
           }
        }
        
        • 这是spring boot自动配置类
        • 默认情况下是对所有请求进行权限控制
        @Configuration(proxyBeanMethods = false)
        @ConditionalOnClass(WebSecurityConfigurerAdapter.class)
        @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class)
        @ConditionalOnWebApplication(type = Type.SERVLET)//条件:运行servlet类型的容器时启用
        public class SpringBootWebSecurityConfiguration {
        
           @Configuration(proxyBeanMethods = false)
           @Order(SecurityProperties.BASIC_AUTH_ORDER)
           static class DefaultConfigurerAdapter extends WebSecurityConfigurerAdapter {                 
           }
        
        }
        
    • 如何生成默认登录界面?
      1. 请求 /hello 接口,在引入 spring security 之后会先经过一些列过滤器
      2. 在请求到达 FilterSecuritylnterceptor时,发现请求并未认证。请求拦截下来,并抛出AccessDeniedException 异常。
      3. 抛出AccessDeniedException 的异常会被 ExceptionTranslationFilter 捕获,这个 Filter 中会调用 LoginUrlAuthenticationEntryPoint#commence 方法给客户端返回 302,要求客户端进行重定向到 /ogin 页面。
      4. 客户端发送 /login 请求。
      5. /login 请求会再次被拦截器中 DefaultLoginPageGeneratingFilter 拦截到,并在拦截器中返回生成登录页顾