2. Introduction介绍

2.1什么是spring安全?

Spring Security为基于Java EE的企业软件应用程序提供全面的安全服务。特别强调支持使用Spring框架构建的项目,在企业软件开发方面,Spring框架领先Java EE解决方案。如果您没有使用Spring来开发企业应用程序,我们强烈建议您仔细研究一下。对Spring(特别是依赖注入原理)的一些熟悉将帮助您更容易地掌握Spring安全性。

人们使用Spring安全有很多原因,但大多数人在发现Java EE的Servlet规范或EJB规范的安全特性缺乏典型企业应用场景所需的深度后,才被吸引到项目中。在提到这些标准时,重要的是要认识到它们在WAR或eEAR水平上是不可携带的。因此,如果切换服务器环境,通常需要在新的目标环境中重新配置应用程序的安全性。使用Spring Security克服了这些问题,还为您带来了许多其他有用的、可定制的安全特性。

您可能知道应用程序安全的两个主要方面是“身份验证”和“授权”(或“访问控制”)。这是spring安全目标的两个主要方面。”“身份验证”是建立主体的过程,即主体声称是谁(“主体”通常指可以在应用程序中执行操作的用户、设备或其他系统。“授权”是指决定是否允许主体在应用程序中执行操作的过程。为了到达需要授权决策的点,主体的身份已经由身份验证过程建立。这些概念是常见的,根本不是特定于SpringSecurity的。

在身份验证级别,Spring安全支持多种身份验证模型。大多数认证模型要么由第三方提供,要么由相关标准机构(如互联网工程特别工作组)开发。此外,Spring Security还提供了自己的一组身份验证功能。具体来说,Spring Security目前支持与所有这些技术的身份验证集成:

1、HTTP BASIC authentication headers: HTTP基本身份验证头(基于IETF-RFC的标准)

2、HTTP Digest authentication headers: HTTP摘要身份验证头(基于IETF-RFC的标准)

3、HTTP X.509 client certificate exchange:  HTTP X.509客户端证书交换(基于IETF RFC的标准)

4、LDAP(跨平台身份验证需求的一种非常常见的方法,特别是在大型环境中)

5、Form-based authentication: 基于表单的身份验证(用于简单的用户界面需求)

6、OpenID authentication: OpenID身份验证

7、Authentication based on pre-established request headers: 基于预先建立的请求头的身份验证(例如Computer Associates Siteminder)

8、Jasig Central Authentication Service:  Jasig中央身份验证服务(也称为CAS,它是一个流行的开源单点登录系统)

9、远程方法调用(RMI)和HttpInvoker(Spring远程处理协议)的透明身份验证上下文传播

10、Automatic "remember-me" authentication: 自动“记住我”身份验证(因此您可以勾选一个框以避免在预定时间段内重新进行身份验证)

11、Anonymous authentication: 匿名身份验证(允许每个未经身份验证的调用自动采用特定的安全标识)

12、Run-as authentication:  运行身份验证(如果一个调用应使用不同的安全标识,则此功能非常有用)

13、Java Authentication and Authorization Service: Java身份验证和授权服务(JAAS)

14、Java EE container authentication: Java EE容器身份验证(如果需要,您仍然可以使用容器管理的身份验证)

15、Kerberos

Java Open Source Single Sign-On (JOSSO) *

OpenNMS Network Management Platform *

AppFuse *

AndroMDA *

Mule ESB *

Direct Web Request (DWR) *

Grails *

Tapestry *

JTrac *

Jasypt *

Roller *

Elastic Path *

Atlassian Crowd *

(*表示由第三方提供)

许多独立软件供应商(isv)之所以采用Spring安全性,是因为它们选择了灵活的身份验证模型。这样做可以让他们快速地将他们的解决方案与他们的最终客户需要的任何东西集成起来,而无需进行大量的工程设计或要求客户改变他们的环境。如果上面的认证机制都不适合您的需要,那么Spring Security是一个开放的平台,编写您自己的认证机制非常简单。许多Spring Security的公司用户需要与不遵循任何特定安全标准的“遗留”系统集成,springsecurity很乐意与这些系统“友好地合作”。

不管身份验证机制如何,Spring安全性都提供了一组深入的授权功能。主要关注三个方面:授权web请求、授权是否可以调用方法以及授权对单个域对象实例的访问。为了帮助您理解这些区别,请分别考虑Servlet规范web模式安全性、EJB容器管理安全性和文件系统安全性中的授权功能。Spring Security在所有这些重要领域都提供了深入的功能,我们将在本参考指南的后面部分进行探讨。

2.2历史

spring安全始于2003年底,被称为“spring的Acegi安全系统”。Spring开发人员的邮件列表中提出了一个问题,询问是否考虑过基于Spring的安全实现。当时spring的社区相对较小(特别是与今天的规模相比!)实际上,从2003年初开始,Spring本身只是作为SourceForge项目存在的。对这一问题的答复是,这是一个值得探索的领域,尽管目前由于缺乏时间,无法进行勘探。

考虑到这一点,我们构建了一个简单的安全实现,但没有发布。几周后,Spring社区的另一个成员询问了安全性问题,当时这段代码被提供给了他们。随后又有其他几项要求,到2004年1月,大约有20人在使用该代码。其他人也加入了这些先驱用户的行列,他们建议在2004年3月正式建立一个SourceForge项目。

在早期,该项目没有任何自己的身份验证模块。身份验证过程依赖容器管理的安全性,而Acegi安全性则侧重于授权。这起初是合适的,但是随着越来越多的用户请求额外的容器支持,特定于容器的身份验证领域接口的基本限制变得清晰起来。还有一个相关的问题是在容器的类路径中添加新的jar,这是最终用户混淆和错误配置的常见来源。

随后引入了Acegi安全特定的身份验证服务。大约一年后,Acegi安全成为一个正式的Spring框架子项目。1.0.0最终版本于2006年5月发布,此前两年半的时间里,它在众多生产软件项目中得到了积极的应用,并进行了数百项改进和社区贡献。

2007年底,Acegi Security成为一个正式的Spring项目组合,并被重新命名为“Spring Security”。

今天,SpringSecurity拥有一个强大而活跃的开源社区。支持论坛上有成千上万条关于SpringSecurity的消息。有一个活跃的基于代码本身的核心开发人员和一个活跃的社区,也定期共享补丁和支持他们的同行。

2.3版本编号

理解Spring Security版本号是如何工作的是很有用的,因为它将帮助您识别迁移到项目的未来版本所涉及的工作(或缺少工作)。每个版本都使用标准的三元组整数:大、小、补丁。其目的是,主要版本是不兼容的,大规模升级的API。次要版本应该在很大程度上保持源代码和二进制代码与较旧次要版本的兼容性,因为可能会有一些设计更改和不兼容的更新。补丁级别应该是完全兼容的,向前和向后,除了可能的修改,这是修复错误和缺陷。

受更改影响的程度将取决于代码的集成程度。如果您正在进行大量的定制,那么与使用简单的命名空间配置相比,您更可能受到影响。在发布新版本之前,您应该始终彻底测试应用程序。

2.4spring security

你可以通过几种方式获得spring security。您可以从主Spring Security页面下载一个打包的发行版,从Maven中央存储库(或用于快照和里程碑版本的springmaven存储库)下载单个jar,或者,您也可以自己从源代码构建项目。

2.4.1与Maven一起使用

最小的Spring Security Maven依赖集通常如下所示:


 

如果您正在使用其他特性,如LDAP、OpenID等,则还需要包含适当的第2.4.3节“项目模块”。

Maven存储库

所有GA版本(即以.RELEASE结尾的版本)都部署到Maven Central,因此不需要在pom中声明其他Maven存储库。


如果您使用的是快照版本,则需要确保已按如下所示定义了Spring快照存储库:

 


 

如果您使用的是一个里程碑或发布候选版本,那么您需要确保已经定义了如下所示的Spring里程碑存储库:

 


 

Spring框架Bom

Spring Security是根据Spring Framework 4.3.26.RELEASE构建的,但应该与4.0.x一起工作。许多用户会遇到的问题是,springsecurity的可传递依赖性解决了springframework4.3.26.RELEASE,这可能会导致奇怪的类路径问题。

规避这个问题的一种方式是在你的pom文件的 <dependencyManagement> 的部分.另一种办法是像下面这样在pom.xml中包含spring-framework-bom <dependencyManagement> :

 


 

这样将确保Spring Security传递的所有依赖都使用 Spring 4.16.RELEASE {spring-version} 模块.

此方法使用Maven的“物料清单”(BOM)概念,并且仅在Maven 2.0.9+中可用。有关如何解析依赖项的更多详细信息,请参阅Maven的依赖机制文档简介。

2.4.3项目模块

在Spring Security 3.0中,代码库被细分为单独的jar,这些jar更清楚地分离了不同的功能区域和第三方依赖关系。如果您使用Maven构建项目,那么这些模块将添加到pom.xml文件. 即使您不使用Maven,我们也建议您咨询pom.xml文件了解第三方依赖关系和版本的文件。或者,一个好主意是检查示例应用程序中包含的库。

Core - spring-security-core.jar

包含核心身份验证和访问控制类和接口、远程处理支持和基本配置API。

任何使用Spring Security的应用程序都需要。

支持独立应用程序、远程客户端、方法(服务层)安全和JDBC用户配置。

包含顶级软件包:

org.springframework.security.core

org.springframework.security.access

org.springframework.security.authentication

org.springframework.security.provisioning

Remoting - spring-security-remoting.jar

 

提供与Spring Remoting的集成。

除非您正在编写使用Spring Remoting的远程客户机,否则不需要这个。

主要包是org.springframework.security.remoting.

Web - spring-security-web.jar

包含筛选器和相关的web安全基础结构代码。任何具有servlet API依赖关系的内容。

如果需要Spring Security web身份验证服务和基于URL的访问控制,就需要它。

主要包是org.springframework.security.web.

Config - spring-security-config.jar

包含安全命名空间解析代码和Java配置代码。

如果使用Spring Security XML命名空间进行配置或Spring Security的Java配置支持,则需要它。

主要包是: org.springframework.security.config.这些类都不打算在应用程序中直接使用。

LDAP - spring-security-ldap.jar

LDAP身份验证和配置代码。

如果需要使用LDAP身份验证或管理LDAP用户条目,则需要。

顶级包是org.springframework.security.ldap.

ACL - spring-security-acl.jar

专用域对象ACL实现。用于对应用程序中的特定域对象实例应用安全性。

顶级包是org.springframework.security.acls.

CAS - spring-security-cas.jar

Spring Security的CAS客户端集成。如果您想在CAS单点登录服务器上使用Spring Security web身份验证。

顶级包是org.springframework.security.cas.

OpenID - spring-security-openid.jar

OpenID web身份验证支持。用于根据外部OpenID服务器对用户进行身份验证。org.springframework.security.openid 需要OpenID4Java。

Test - spring-security-test.jar

用于spring安全测试。

2.4.4检出源代码

由于Spring Security是一个开源项目,我们强烈建议您使用git检查源代码。

这将使您能够完全访问所有示例应用程序,并且您可以轻松地构建项目的最新版本。

拥有项目的源代码对调试也有很大帮助。异常堆栈跟踪不再是晦涩难懂的黑盒问题,但您可以直接找到导致问题的那条线,并找出发生了什么。

源代码是一个项目的最终文档,通常是了解某个项目实际工作方式的最简单的地方。

要获取项目的源代码,请使用以下git命令:git clone https://github.com/spring-projects/spring-security.git

这将允许您访问本地计算机上的整个项目历史记录(包括所有版本和分支)。

 

posted @ 2020-08-16 20:08  节日快乐  阅读(306)  评论(0编辑  收藏  举报