Spring Security 系列第0章

5 篇文章 0 订阅
1 篇文章 0 订阅

个人博客

介绍

Spring Security 是一个安全框架,它提供身份验证授权和针对常见攻击的保护。它支持 ServletReactive 应用的保护。

以上是 Spring 官方的介绍,从开发人员角度来说它就是一串大的 Filter (FilterChain 责任链设计模式),一个接着一个。对于早期 Java Web 开发人员最熟悉不过了。

回顾 Filter

在这里插入图片描述

大多数流行的 Java Web 还是运行在 Tomcat 容器之上,所以还是说 Tomcat 容器为主,Tomcat 是 Servlet 容器规范的一种实现。Servlet 规范中有很多组件,比如 Servlet 组件,Filter 组件等,不同组件有不同功能**。(千万别把规范和组件搞混)**

为了屏蔽 Filter 组件细节,Servlet 规范也提出接口让用户实现,也就是在 Java Web 应用中实现过滤器的 Filter 接口

Filter 是用于修改 HTTP 请求和响应的一条流水线,客户端向服务端发送请求时候先由 Tomcat 转发到 Filter,多个 Filter 在 Tomcat 会创建为 FilterChain 形成一条链。

只要能满足当前的 Filter 就可以通过调用 doFilter 传递给下一个 Filter,否则就直接返回,走不到受保护的业务代码。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// do something before the rest of the application
    chain.doFilter(request, response); // invoke the rest of the application
    // do something after the rest of the application
}

整体架构

通过上述知道 Filter 可以做到检测请求或修改响应,Spring Security 就是实现 Filter 完成的。

在这里插入图片描述

在 Spring Security 的 Filter 实现类为 DelegatingFilterProxy 它作为 Servlet 容器和 Spring 的桥梁,也就是定义在 Spring Bean 的 Filter 也能注册到 Servlet 容器,它另一个好处是它允许延迟加载 Filter 实例。

这是 DelegatingFilterProxy 的伪代码。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// Lazily get Filter that was registered as a Spring Bean
	// For the example in DelegatingFilterProxy delegate is an instance of Bean Filter0
	Filter delegate = getFilterBean(someBeanName);
	// delegate work to the Spring Bean
	delegate.doFilter(request, response);
}

DelegatingFilterProxy 里面包含一个 FilterChainPorxy 是一个特殊的 Filter Bean ,它被 Spring 管理。它主要用于根据 HttpServletRequest 内容匹配调用其他 Security FilterSecurity Filter 是扩展更多功能的 Filter。

Security Filters 框架内置实现,不同的 Filter 实现的是身份验证授权和针对常见攻击的保护功能。

  • CasAuthenticationFilter
  • OAuth2LoginAuthenticationFilter
  • Saml2WebSsoAuthenticationFilter
  • UsernamePasswordAuthenticationFilter

Q&A

Q:为什么不用 DelegatingFilterProxy 直接匹配 URL,而是用 FilterChainPoryx?

A: 因为需要清理 SecurityContext 带来的内存。

Q:为什么 Spring Security 有这么多内置过滤器?

A:这些过滤器的实现都是来自业界内定义好的协议实现,就比如 HTTP 协议一样。

参考链接:https://docs.spring.io/spring-security/reference/5.7/servlet/architecture.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值