1.Spring Security 简介
Java企业级开发生态丰富,无论你想做哪方面的功能,都有众多的框架和工具可供选择, 以至于SUN公司在早些年不得不制定了很多规范,这些规范在今天依然影响着我们的开发, 安全领域也是如此,然而,不同于其他领域,在Java企业级开发中,安全管理方面的框架非常少,一般来说,主要有三种方案:
- Shiro
- Spring Security
- 开发者自己实现
Shiro本身是一个老牌的安全管理框架,有着众多的优点,例如轻量、简单、易于集成、 可以在JavaSE环境中使用等。不过,在微服务时代,Shiro就显得力不从心了,在微服务面前, 它无法充分展示自己的优势。
也有开发者选择自己实现安全管理,这一部分人不在少数,但是一个系统 的安全,不仅仅是登录和权限控制这么简单,我们还要考虑各种各样可能存在的网络攻击以及防御策略,从这个角度来说,开发者自己实现安全管理也并非是一件容易的事情,只有大公司才有足够的人力物力去支持这件事情。Spring Security作为Spring家族的一员,在和Spring家族的其他成员如Spring Boot、Spring Cloud等进行整合时,具有其他框架无可比拟的优势,同时对OAuth2有着良好的支持,再加 上 Spring Cloud 对 Spring Security 的不断加持(如推出 Spring Cloud Security),让 Spring Security 不知不觉中成为微服务项目的首选安全管理方案。
2.Spring Security 核心功能
对于一个安全管理框架而言,无论是Shiro还是Spring Security,最核心的功能,无非就是如下两方面:
通俗点说,认证就是身份验证(你是谁?),授权就是访问控制(你可以做什么?)
2.1 认证
Spring Security支持多种不同的认证方式,这些认证方式有的是Spring Security自己提供的认证功能,有的是第三方标准组织制订的。Spring Security集成的主流认证机制主要有如下几种:
- 表单认证
- OAuth2.0 认证
- SAML2.0 认证
- CAS 认证
- RememberMe 自动认证
- JAAS 认证
- OpenlD 去中心化认证
- Pre-Authentication Scenarios 认证口
- X509认证
- HTTP Basic 认证
- HTTP Digest 认证
作为一个开放的平台,Spring Security提供的认证机制不仅仅包括上面这些,我们还可以通过引入第三方依赖来支持更多的认证方式,同时,如果这些认证方式无法满足我们的需求, 我们也可以自定义认证逻辑,特别是当我们和一些“老破旧“的系统进行集成时,自定义认证逻辑就显得非常重要了。
2.2 授权
无论釆用了上面哪种认证方式,都不影响在Spring Security中使用授权功能。Spring Security支持基于URL的请求授权、支持方法访问授权、支持SpEL访问控制、支持域对象安全(ACL),同时也支持动态权限配置、支持RBAC权限模型等,总之,我们常见的权限管理需求,Spring Security基本上都是支持的。
2.3 其他
在认证和授权这两个核心功能之外,Spring Security还提供了很多安全管理的“周边功能”, 这也是一个非常重要的特色。
大部分Java工程师都不是专业的Web安全工程师,自己开发的安全管理框架可能会存在 大大小小的安全漏洞,而Spring Security的强大之处在于,即使你不了解很多网络攻击,只要使用了 Spring Security,它会帮助我们自动防御很多网络攻击,例如CSRF攻击、会话固定攻击等,同时Spring Security还提供了 HTTP防火墙来拦截大量的非法请求。由此可见,研究Spring Securityr也是研究常见的网络攻击以及防御策略。
对于大部分的Java项目而言,无论是从经济性还是安全性来考虑,使用Spring Security 无疑是最佳方案。
3. Spring Security 整体架构
3.1 认证和授权
3.1.1 认证
在 Spring Security 的架构设计中,认证(Authentication)和授权(Authorization)是分开的,无论使用什么样的认证方式,都不会影响授权,这是两个独立的存在,这种独立带来的好处之一,就是Spring Security可以非常方便地整合一些外部的认证方案。
在Spring Security中,用户的认证信息主要由Authentication的实现类来保存, Authentication 接口定义如下:
[code]public interface Authentication extends Principal, Serializable { Collection |