Spring Security 简介
1. 前言
不难证明,外卖和我们的生活越来越紧密,我们也许天天都点外卖,那有没有想过,为什么我们敢把自己的姓名、身份证、手机、银行卡、家庭住址等等一系列敏感信息都放心地告诉给第三方平台?这离不开一个词「信任」。当我点了一单外卖,为什么饭店看得到我的订单?为什么配送员可以找得到我家?为什么客服中心可以处理投诉?为什么财务人员可以划拨?这里又出现了另一个词「职责」。
所谓「信任」,就是我知道你是谁,我也相信你做的事;所谓「职责」,就是我们相互独立又共同协作。在 IT 系统中,「信任」是通过「认证」来完成的,「职责」是通过「权限」来实现的,它们又被统称为「应用安全」。可见,「安全」是 IT 系统正常运营的必要条件之一。既然「安全」如此重要,那有没有一套框架可以帮助 Spring Boot 开发者快速地、规范地、有效地构建自己 IT 系统的安全环境呢?当然有,那就是本次课程的主题:「Spring Security」安全框架。
2. Spring Security 简介
2.1 Spring Security 的诞生
Spring Security 是 Spring 家族的中,提供认证、授权和攻击防护功能的一套安全框架。Spring Security 支持命令式和响应式两种开发模式,它也是 Spring 应用在安全框架方面的公认标准。
Spring Security 的前身是 Acegi security。Acegi security 在 1.0.7 版本之后便不再跟新,转而以 Spring Security 2.0 的身份出现在 Spring 大家庭中。截止今日(2020 年 5 月 17 日),Spring Security 正式版本已经发展至 5.3,并且已经公布 5.4 的预览版本。
2.2 Spring Security 和同类型框架的比较
Java 环境下有两大安全框架:Spring Security 和 Shiro。
和 Spring Security 一样,Shiro 同样隶属于一个强大的软件社区: Apache。二者的功能类似,都完成了认证和鉴权功能,都有超过十年的发展历史。Shiro 是一个独立的安全框架,Spring Security 则与 Spring 关联紧密,所以在二者的选择上,可以简单的用如下原则区分:
如果我们开发 Spring Boot 项目,那优先建议使用 Spring Security 安全框架。如果我们开发其他类型的项目,那请使用 Shiro 作为安全框架。
Spring Security 安全框架适合为 Spring Boot 项目提供安全保护,所以如果您是个 Spring Boot 项目的开发人员,且正在寻找一种可以和 Spring Boot 轻松集成的,用于认证和鉴权的框架时,可以优先考虑 Spring Security。
2.3 Spring Security 相关资源:
3. Spring Security 的特性
Spring Security 的核心特性包括:认证和授权、常规攻击防范、与 Servlet 接口集成、与 Spring MVC 集成等。
认证和授权的目的是,让系统知道使用者是谁(认证)?是什么样的身份?允许他做什么?禁止他做什么?通常的做法是要求用户输入自己的用户名和密码,来实现登录和鉴权的过程。
常规攻击防范在 Spring Security 安全框架中是默认开启的,常见的威胁抵御方式有:
- 防止伪造跨站请求(CSRF)
- 安全响应头(HTTP Response headers)
- HTTP 通讯安全
作为 Spring 大家族的一员,Spring Security 在与 Spring 引用,尤其是与 Spring boot 应用的结合时,显得极为便利。
3. 功能模块
Spring Security 安全框架,内置一系列的安全子模块,用来满足不同类型的应用场景。自 3.0 版本开始,这些子模块被分散到了不同的 Jar 包中,开发者可以更加清晰地、直接地选择自己需要的模块,简单有效地完善自己的业务功能。
Spring Security 包含的功能模块如下:
-
Core
核心模块,包含认证、访问控制、集成支持、配置接口等,所有 Spring Security 项目都需要依赖它。
对应的 Jar 文件:spring-security-core.jar。
-
Remoting
Spring security 中的 Remoting 模块提供了与 Spring Remoting 集成的能力。当我们要开发远程客户端的时候需要用到此模块。
对应的 Jar 文件:spring-security-remoting.jar。
-
Web
Spring security 中的 Web 模块,提供了接口过滤器和 Web 安全的基础代码。例如 Servlet 应用接口。如果我们开发的是基于 Web 认证的服务,或者是基于 URL 的访问控制时,将需要用到此模块。
对应的 Jar 文件:spring-security-web.jar
-
Config
Spring security 中的 Config 模块,包含了安全框架命名空间的解析功能与提供了 Java 配置代码。当我们需要使用 XML 方式或者 Java 配置方式时,需要用到此模块。
对应的 Jar 文件:spring-security-config.jar
-
LDAP
Spring security 中的 Ldap 模块,提供了对 Ldap 认证的支持,当我们使用 Ldap 认证时,需要用到此模块。
对应的 Jar 文件:spring-security-ldap.jar
-
OAuth 2.0 相关模块
Spring security 提供了对 OAuth 2.0 的支持,具体分为以下几个模块。
-
OAuth 2.0 Core
OAuth 2.0 Core 模块是 Spring security 安全框架中,对 OAuth 2.0 支持的核心模块,包含了认证功能与 OpenID 的基本支持。
对应的 Jar 文件:spring-security-oauth2-core.jar
-
OAuth 2.0 Client
OAuth 2.0 Client 模块是 OAuth 2.0 客户端认证授权基础,当我们需要在客户端实现 OAuth 2.0 登录功能时,需要添加此模块。
对应的 Jar 文件:spring-security-oauth2-client.jar
-
OAuth 2.0 JOSE
OAuth 2.0 JOSE (Javascript Object Signing and Encryption)模块,提供了基于 JS 对象的认证与加解密功能,核心目标是实现 JS 安全传输能力。主要功能有:JWT、 JWS、JWE、JWK。
对应的 Jar 文件:spring-security-oauth2-jose.jar
-
OAuth 2.0 Resource Server
OAuth 2.0 resource server 模块,提供了 OAuth 2.0 资源服务的基本功能,也就是对资源的访问控制。
对应的 Jar 文件:spring-security-oauth2-resource-server.jar
-
-
ACL
ACL 模块提供了基于域对象的访问控制。
对应的 Jar 文件:spring-security-acl.jar
-
CAS
CAS 模块适用于需要使用 CAS 单点登录的系统,可以用于单点登录客户端的集成。
对应的 Jar 文件:spring-security-cas.jar
-
OpenID
OpenID 模块适用于需要集成外部 OpenID 的认证系统。使用该模块功能同时还需要依赖 OpenID4Java 。
对应的 Jar 文件:spring-security-openid.jar
-
Test
Test 模块提供了对 Spring security 进行单元测试的能力。
对应的 Jar 文件:spring-security-test.jar
4. 开始前准备
Spring Security 要求使用 JDK 8 以上的 Java 编译版本。
在 Spring Boot 项目中添加 Spring Security 支持非常方便,只需要使用 Spring Boot 提供的 spring-boot-starter-security
启动器即可。
在非 Spring Boot 项目中使用 Spring Security 则需要添加 Spring Security 核心组件,如:spring-security-config
和 spring-security-web
等。
5. 小结
Spring Security 是 Spring 家族中规范化的安全框架。它帮助我们轻松地构建应用安全环境,可以快速地实现「认证」和「权限」管理,它帮助我们规范化开发过程,是一套完整、成熟、易用的开发框架。
下一节,我们将尝试创建第一个 Spring Security 应用。