这是我参与「第五届青训营 」伴学笔记创作活动的第 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 { } }
- 如何生成默认登录界面?
- 请求 /hello 接口,在引入 spring security 之后会先经过一些列过滤器
- 在请求到达 FilterSecuritylnterceptor时,发现请求并未认证。请求拦截下来,并抛出AccessDeniedException 异常。
- 抛出AccessDeniedException 的异常会被 ExceptionTranslationFilter 捕获,这个 Filter 中会调用 LoginUrlAuthenticationEntryPoint#commence 方法给客户端返回 302,要求客户端进行重定向到 /ogin 页面。
- 客户端发送 /login 请求。
- /login 请求会再次被拦截器中 DefaultLoginPageGeneratingFilter 拦截到,并在拦截器中返回生成登录页顾
- Spring Security如何做到仅引入一个依赖就能将我们的接口保护起来?