导览
前言
博主精心准备的
一文读懂Spring
系列文章,旨在通过简洁精炼的语言,展现Spring内部精妙的设计思想。我们知道Spring是一个web容器,不知道的同学,可以把它视为一个
“盒子”
。凡是符合添加规则的组件,均可装进这个
“盒子”
,再注入一点架构设计,进而实现你的业务逻辑。
话不多言,再接再厉,本文继续带着各位盆友读懂Spring。今天的主角是谁呢?
Spring Security
。那么有请它先亮个相吧。
Spring Security必学必看
Security是安全的意思.首先我们来看看什么是安全以及如何做到安全可靠。
安全是一个不断演进的目标,追求一个全面的、系统级别的安全方案是非常重要的。站在安全领域的角度,我们鼓励分层的概念,每一层都只管理自己职责范围内的安全问题,每一层的安全机制越严格,我们的应用就越健壮、越安全。
以下是常用的系统安全措施:
- 在最底层,我们需要处理传输层安全和系统识别,从而避免中间人(
man-in-the-middle
)攻击。 - 我们会使用防火墙,可能会联合VPN或者IP安全机制来保证只有被授权的系统才能进行连接。
- 在企业环境中,我们需要部署一个DMZ(
demilitarized zone
)服务来隔离对外提供访问的接口的服务器与内部数据库和应用服务器。 - 我们的操作系统也扮演了安全中的一环。 例如使用不具有特定权限的用户运行进程,限制用户最大可以操作的文件数量等。操作系统通常也会配置自己的防火墙。
- 我们可能还会尝试使阻止DDOS(
Distributed DenialofService
)分布式拒绝服务和暴力破解攻击(brute force attacks
)。一个入侵检测系统对于攻击的监控和响应是非常有用的,可以帮助我们实时的拒绝某些TPC/IP地址的访问。
了解安全的概念后,博主正式谈谈Spring Security为此付出了哪些努力。
1. 简介
Spring Security为J2EE企业级应用提供了全面的安全服务。
这里有一个特别的强调的地方,应用是基于Spring框架开发的。如果你熟悉Spring框架(特别是DI原则),那么你可以快速地了解Spring Security。
应用程序安全性大致可以归为两个独立的问题:
身份验证
(你是谁?)和
授权
(你可以做什么?)。当然,这里的授权也可以理解为访问控制。 Spring Security 有一个旨在将认证与授权分开的体系结构,并兼备多种策略和扩展点。除了验证机制,它还提供了以下3个方面授权能力:
- 对web请求进行授权
- 授权某个方法是否可以被调用
- 授权访问单个领域对象实例
正如下图一样,基于
Chain
访问控制,实现了精细化的授权和认证作业,支持你通过各种
Filter
实现准确的安全控制。
2. 架构
Spring Security采用servlet过滤机制,为Web应用程序提供安全的体系结构。
架构示意如下:
博主做一个技术分解,对此图进行分步说明:
- 客户端向Web应用程序发送请求。
- FilterChainProxy(Servlet过滤器)接收到请求时,先调用Firewall,使HttpServletRequest 和HttpServletResponse的安全防护具体化。
- FilterChainProxy将进程分配给Security Filter类,以获取Spring Security提供的安全对策。
- Security Filter由多个类组成,如果servlet过滤器过程成功完成,则调用后续的servlet过滤器。
- 成功完成最后一个安全筛选器进程后,将调用后续进程(如servlet筛选器或servlet),并访问Web应用程序中的资源。
- FilterChainProxy class将Web应用程序返回的资源响应发送给客户端。
Security Filter
类是一个servlet过滤器类,它提供实现框架功能和安全对策功能所需的过程。Spring Security是一种通过链接多个安全过滤器来实现Web应用程序安全对策的机制。
这里介绍一下实现认证和授权功能所需的核心类:
类名用途SecurityContextPersistenceFilter跨请求共享身份验证信息过程的类。UsernamePasswordAuthenticationFilter使用request参数中指定的用户名和密码执行身份验证过程的类LogoutFilter执行注销过程的类FilterSecurityInterceptor用于执行HTTP请求(HttpServletRequest)的授权过程的类ExceptionTranslationFilter处理异常的类
2.1 认证
AuthenticationManager是实现认证过程的接口,其默认实现类为ProviderManager。DaoAuthenticationProvider通过检查在数据存储中注册的用户凭据和用户状态来执行身份验证过程。其中,需从实现UserDetails接口的类中获取检查所需的凭据和用户状态。
认证流程如下:
其中AuthenticationFilter包含以下几类:
- UsernamePasswordAuthenticationFilter 从servlet过滤器类中的HTTP请求参数获取凭据以进行表单身份验证。
- BasicAuthenticationFilter 从servlet过滤器类中的HTTP请求的身份验证标头获取凭据以进行基本身份验证。
- DigestAuthenticationFilter 从用于摘要式身份验证的servlet过滤器类中的HTTP请求的身份验证标头中获取凭据。
- RememberMeAuthenticationFilter 从用于记住我身份验证的servlet过滤器类中的HTTP请求中获取凭据。 如果启用了“记住我”身份验证,即使浏览器已关闭且会话超时,用户也会保持登录状态。
在实际业务场景中,我们是这么使用的(可参考):
2.2 授权
授权流程如下:
如图所示,Spring Security提供了3种类型的实现类,所有类都调用了
AccessDecisionVoter
接口方法,并确定是否已授予访问权限。
AccessDecisionVoter
投票支持分配,拒绝或弃权,然后实施类
AccessDecisionManager
汇总投票结果并确定最终访问权限。
AccessDeniedException
如果确定为无访问权限,则抛出异常并拒绝访问。
授权过程中的核心类包括:
- ExceptionTranslationFilter 是一个安全过滤器,它处理由授权进程(
AccessDecisionManager
)生成的异常,并向客户端发送适当的响应。在默认实现中,返回在未经身份验证的用户访问时请求身份验证的响应,以及在经过身份验证的用户的情况下发出授权错误的响应。 - FilterSecurityInterceptor 是一个安全过滤器,用于为HTTP请求应用授权过程并将实际授权过程委派给
AccessDecisionManager
。在调用AccessDecisionManager接口方法时,它与客户端尝试访问的资源中指定的访问策略链接。 - AccessDecisionManager 检查用户是否具有他尝试访问的资源的访问权限。
3. 对策
Spring Security
提供跨站点请求伪造(以下简称CSRF)的对策功能。包括:
- 嵌入机密信息(令牌)
- 重新输入密码
- Referer’检查
CSRF对策不仅应该用于登录请求,还应该用于登录过程。如果没有为登录过程实施CSRF对策,即使用户发现了问题,也会被迫使用攻击者创建的帐户登录,此时登录的操作历史可能被盗。
Spring Security发出为每个会话随机生成的固定令牌值(CSRF令牌),并将发布的CSRF令牌作为请求参数发送(HTML表单中的隐藏字段)。
按上图流程顺序,博主逐一加以说明:
- 客户端使用HTTP GET方法访问应用程序服务器。
- Spring Security生成CSRF令牌并将其存储在HTTP会话中。生成的CSRF令牌使用HTML表单的隐藏标记与客户端链接。
- 客户端通过单击HTML表单上的按钮向应用程序服务器发送请求。由于CSRF令牌嵌入在HTML表单的隐藏字段中,因此CSRF令牌值作为请求参数发送。
- Spring Security检查在使用HTTP POST方法访问时,请求参数中指定的CSRF令牌值和HTTP会话中保留的CSRF令牌值是否相同。
- 客户端使用HTTP GET方法访问应用程序服务器。
- 使用GET方法访问时,Spring Security不会检查CSRF令牌值。
结语
本文主要介绍了Spring Security的核心原理和应用方法,相关知识尤其在web安全方面非常重要,同样也是面试必答环节,好好研习一下,可助你通关哦。
走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~
精彩回顾
一文读懂Spring AOP的工作原理和机制(面试经)
一文读懂Spring IoC的工作原理和机制(面试经)
一文读懂SpringMVC的工作原理
Springboot中基于X509完成SSL检验的原理与实践
基于springboot+enum配置化实践
版权归原作者 一叶飞舟 所有, 如有侵权,请联系我们删除。