什么是Spring Security
Spring Security是 Spring resource社区的一个安全组件, Spring Security为 JavaEE企业级开发提供了全面的安全防护。
安全防护是一个不断变化的目标, Spring Security通过版本不断迭代来实现这一目标。 Spring Security采用“安全层”的概念,使每一层都尽可能安全,连续的安全层可以达到全面的防护。
Spring Security可以在 Controller层、 Service层、DAO层等以加注解的方式来保护应用程序的安全。 Spring Security提供了细粒度的权限控制,可以精细到每一个API接口、每一个业务的方法,或者每一个操作数据库的DAO层的方法。 Spring Security提供的是应用程序层的安全解决方案,一个系统的安全还需要考虑传输层和系统层的安全,例如采用Htps协议、服务器部署防火墙等。
为什么选择Spring Security
使用Spring Security有很多原因,其中一个重要原因是它
对环境的无依赖性、低代码耦合性
。
将工程重现部署到一个新的服务器上,不需要为Spring Security 做什么工作。SpringSecurity提供了数十个安全模块,模块与模块间的耦合性低,模块之间可以自由组合来实现特定需求的安全功能,具有较高的可定制性。总而言之,Spring Security 具有很好的可复用性和可定制性。
在安全方面,有两个主要的领域,一是“认证”,即你是谁;二是“授权”,即你拥有什么权限,Spring Security的主要目标就是在这两个领域。“认证”是认证主体的过程,通常是指可以在应用程序中执行操作的用户、设备或其他系统。“授权”是指决定是否允许已认证的主体执行某一项操作。
安全框架多种多样,那为什么选择SpringSecurity作为微服务开发的安全框架呢?JavaEE有另一个优秀的安全框架Apache Shiro, Apache Shiro在企业级的项目开发中十分受欢迎,一般使用在单体服务中。但在微服务架构中,目前版本的ApacheShiro是无能为力的。
Spring Security来自Spring Resource社区,采用了注解的方式控制权限,熟悉Spring的开发者很容易上手Spring Security。另外一个原因就是Spring Security易于应用于Spring Boot工程,也易于集成到采用SpringCloud构建的微服务系统中。
Spring Security提供的的安全模块
在安全验证方面,Spring Security提供了很多的安全验证模块。大部分的验证模块来自第三方的权威机构或者一些相关的标准制定组织,Spring Security自身也提供了一些验证模型。
Spring Security目前支持对以下技术的整合:
-
:一个基于IETF RFC的标准HTTP BASIC头认证
-
:一个基于IETF RFC的标准HTTP Digest头认证
-
:一个基于IETF RFC的标准HTTP X.509客户端证书交换认证
-
:一种通用的跨平台身份验证,特别是在大型软件架构中LDAP
-
基于表单的验证
-
OpenID验证
-
基于预先建立的请求头的验证
-
:也被称为CAS,是一个流行的开源单点登录系统Jasig Central Authentication Service
-
远程方法调用 (RMI)和HttpInvoker (Spring 远程协议)的认证
-
自动“记住我"的身份验证
-
匿名验证(允许每一次未经身份验证的调用)
-
Run-as身份验证(每次调用都需要提供身份标识)
-
Java认证和授权服务
-
Java EE容器认证
-
Kerberos
-
Java开源的单点登录*
-
OpenNMS网络管理平台*
-
AppFuse *
-
AndroMDA *
-
Mule ESB *
-
Direct Web Request (DWR) *
-
Grails *
-
Tapestry *
-
JTrac *
-
Jasypt *
-
Roller *
-
Elastic Path *
-
Atlassian Crowd*
-
自己创建的认证系统
以上都是Spring Security支持的安全验证模块,其中带*的是来自第三方的安全验证模块,Spring Security对这些模块做了整合和封装。
Spring Boot Security与Spring Security的关系
在Spring Security框架中,主要包含了两个依赖Jar,分别是spring-security-web依赖和spring-security-config依赖:
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
Spring Boot对Spring Security框架做了封装,仅仅是封装,并没有改动Spring Security这两个包的内容,并加上了Spring Boot的起步依赖的特性。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
进入spring-boot-starter-security的pom文件,可以发现pom文件包含了Spring Security的两个Jar包,并移除了这两个Jar包的apo功能,引入了aop的依赖,另外包含了spring-boot-starter的依赖。由此可见,spring-boot-starter-security 是对Spring Security的一-个封装。