1.Spring Security 社区

欢迎来到Spring Security社区! 本节讨论如何充分利用我们庞大的社区。

1.1 获得帮助

如果您需要有关Spring Security的帮助,我们随时为您提供帮助。 以下是获得帮助的一些最佳步骤:

1.2 成为参与者

我们欢迎您参与Spring Security项目。有很多贡献方式,包括回答StackOverflow上的问题,编写新代码,改进现有代码,协助 使用文档,开发示例或教程,报告错误或只是提出建议。

1.3 源代码

Spring Security的源代码可以在GitHub上找到https://github.com/spring-projects/springsecurity/

1.4 Apache 2许可证

Spring Security是在Apache License 2.0下发布的开源软件。

1.5 社交媒体

您可以在Twitter上关注@SpringSecuritySpring Security团队,了解最新消息。 您还可以关注@SpringCentral以了解整个Spring产品组合。

2.Spring Security 5.1中的新功能

Spring Security 5.1提供了许多新功能。 以下是该版本的亮点。

2.1 Servlet

  • 通过UserDetailsPasswordService自动升级密码存储
  • OAuth 2.0客户端
  • 可自定义的授权和令牌请求
  • authorization_code grant support
  • client_credentials授予支持
  • OAuth 2.0资源服务器
    • 支持JWT编码的承载令牌
    • 添加了OAuth2 WebClient集成
    • HTTP防火墙可防止HTTP动词篡改和跨站点跟踪
  • ExceptionTranslationFilter支持通过RequestMatcher选择AccessDeniedHandler
  • CSRF支持排除某些请求
  • 添加了对功能策略的支持
  • 添加了@Transient身份验证令牌
  • 默认登录页面的现代外观

2.2 WebFlux

  • 通过ReactiveUserDetailsPasswordService自动升级密码存储
  • 添加了OAuth2支持
    • 添加了OAuth2客户端支持
    • 添加了OAuth2资源服务器支持
    • 添加了OAuth2 WebClient集成
  • @WithUserDetails现在可以与ReactiveUserDetailsService一起使用
  • 添加了CORS支持
  • 添加了对以下HTTP标头的支持
    • 内容安全政策
    • 功能政策
    • 推荐人政策
  • 重定向到HTTPS
  • @AuthenticationPrincipal的改进
  • 支持解析bean
  • 支持解析errorOnInvalidType

2.3集成

  • Jackson支持与BadCredentialsException一起使用
  • @WithMockUser支持在测试中设置SecurityContext时进行自定义。例如,@WinMockUser(setupBefore=TestExecutionEvent.TEST_EXECUTION)将在JUnit的@Before之后和测试执行之前设置用户。
  • 可以使用自定义环境变量配置LDAP身份验证
  • X.509身份验证支持将主体派生为策略

3.获得Spring Security

本节讨论了获取Spring Security二进制文件时需要了解的所有内容。 有关如何获取源代码,请参见第1.3节“源代码”。

3.1 发布编号

Spring Security版本的格式为MAJOR.MINOR.PATCH,如下:

  • MAJOR版本可能包含重大更改。 通常这些是为了提供改进的安全性以匹配现代安全实践。
  • MINOR版本包含增强功能,但被视为被动更新
  • PATCH级别应完全兼容,向前和向后,可能的例外是修复错误

3.2 使用Maven

与大多数开源项目一样,Spring Security将其依赖项部署为Maven工件。 以下部分提供有关如何在使用Maven时使用Spring Security的详细信息。

使用Maven的Spring Security.

Spring Boot提供了一个spring-boot-starter-security启动程序,它将Spring Security相关的依赖项聚合在一起。利用启动器的最简单和首选方法是使用IDE集成(Eclipse,IntelliJ,NetBeans)或通过https://start.spring.io来使用Spring Initializr。或者,可以手动添加启动器:

pom.xml.

  1. <dependencies>
  2. <!-- ... other dependency elements ... -->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-security</artifactId>
  6. </dependency>
  7. </dependencies>

由于Spring Boot提供Maven BOM来管理依赖版本,因此无需指定版本。 如果您希望覆盖Spring Security版本,可以通过提供Maven属性来实现:

pom.xml.

  1. <properties>
  2. <!-- ... -->
  3. <spring-security.version>5.2.0.M1</spring-security.version>
  4. </dependencies>

由于Spring Security仅对主要版本进行了重大更改,因此使用Spring Boot较新版本的Spring Security是安全的。但是,有时可能还需要更新Spring Framework的版本。 这可以通过添加Maven属性轻松完成:

pom.xml.

  1. <properties>
  2. <!-- ... -->
  3. <spring.version>5.1.4.RELEASE</spring.version>
  4. </dependencies>

如果您正在使用LDAP,OpenID等其他功能,则还需要包含相应的第4章“项目模块”。

Maven中没有使用Spring Boot.

在没有Spring Boot的情况下使用Spring Security时,首选方法是利用Spring Security的BOM 确保在整个项目中使用一致的Spring Security版本。

pom.xml.

  1. <dependencyManagement>
  2. <dependencies>
  3. <!-- ... other dependency elements ... -->
  4. <dependency>
  5. <groupId>org.springframework.security</groupId>
  6. <artifactId>spring-security-bom</artifactId>
  7. <version>5.2.0.M1</version>
  8. <type>pom</type>
  9. <scope>import</scope>
  10. </dependency>
  11. </dependencies>
  12. </dependencyManagement>

轻量级的Spring Security Maven依赖项通常如下所示:

pom.xml.

  1. <dependencies>
  2. <!-- ... other dependency elements ... -->
  3. <dependency>
  4. <groupId>org.springframework.security</groupId>
  5. <artifactId>spring-security-web</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.security</groupId>
  9. <artifactId>spring-security-config</artifactId>
  10. </dependency>
  11. </dependencies>

如果您正在使用LDAP,OpenID等其他功能,则还需要包含相应的第4章“项目模块”。

Spring Security针对Spring Framework 5.1.4.RELEASE构建,但通常应该与任何较新版本的Spring Framework 5.x一起使用。 许多用户将遇到的问题是Spring Security的传递依赖性解决了Spring Framework 5.1.4.RELEASE,它可能导致奇怪的类路径问题。

解决此问题的最简单方法是在pom.xml的<dependencyManagement>部分中使用spring-framework-bom,如下所示:

pom.xml.

  1. <dependencyManagement>
  2. <dependencies>
  3. <!-- ... other dependency elements ... -->
  4. <dependency>
  5. <groupId>org.springframework</groupId>
  6. <artifactId>spring-framework-bom</artifactId>
  7. <version>5.1.4.RELEASE</version>
  8. <type>pom</type>
  9. <scope>import</scope>
  10. </dependency>
  11. </dependencies>
  12. </dependencyManagement>

这将确保Spring Security的所有传递依赖项都使用Spring 5.1.4.RELEASE模块

注意

这种方法使用Maven的“物料清单”(BOM)概念,仅适用于Maven 2.0.9+。 有关如何解析依赖关系的其他详细信息,请参阅Maven的依赖关系机制简介文档。

Maven存储库

所有GA版本(即以.RELEASE结尾的版本)都部署到Maven Central,因此不需要在您的pom中声明其他Maven存储库。 如果您使用的是SNAPSHOT版本,则需要确保定义了Spring Snapshot存储库,如下所示:

pom.xml.

  1. <repositories>
  2. <!-- ... possibly other repository elements ... -->
  3. <repository>
  4. <id>spring-snapshot</id>
  5. <name>Spring Snapshot Repository</name>
  6. <url>https://repo.spring.io/snapshot</url>
  7. </repository>
  8. </repositories>

如果您使用里程碑或候选版本,则需要确保已定义Spring Milestone存储库,如下所示:

pom.xml.

  1. <repositories>
  2. <!-- ... possibly other repository elements ... -->
  3. <repository>
  4. <id>spring-milestone</id>
  5. <name>Spring Milestone Repository</name>
  6. <url>https://repo.spring.io/milestone</url>
  7. </repository>
  8. </repositories>

3.3 Gradle

与大多数开源项目一样,Spring Security将其依赖项部署为Maven工件,这样也允许获得流行的Gradle支持。 以下部分提供有关如何在使用Gradle时使用Spring Security的详细信息。

使用Gradle的Spring Boot

Spring Boot提供了一个spring-boot-starter-security启动程序,它将Spring Security相关的依赖项聚合在一起。 利用启动器的最简单和首选方法是使用IDE集成(Eclipse,IntelliJ,NetBeans)或通过https://start.spring.io来使用Spring Initializr。 或者,可以手动添加启动器:

build.gradle.

  1. dependencies {
  2. compile "org.springframework.boot:spring-boot-starter-security"
  3. }

由于Spring Boot提供Maven BOM来管理依赖版本,因此无需指定版本。如果您希望覆盖Spring Security版本,可以通过提供Gradle属性来实现:

build.gradle.

  1. ext['spring-security.version']='5.2.0.M1'

由于Spring Security仅对主要版本进行了重大更改,因此使用Spring Boot的较新版本的Spring Security是安全的。但是,有时可能还需要更新Spring Framework的版本。 这也可以通过添加Gradle属性轻松完成:

build.gradle.

  1. ext['spring.version']='5.1.4.RELEASE'

如果您正在使用LDAP,OpenID等其他功能,则还需要包含相应的第4章“项目模块”。

在Gradle中没有使用Spring Boot

在没有Spring Boot的情况下使用Spring Security时,首选方法是利用Spring Security的BOM来确保在整个项目中使用一致的Spring Security版本。 这可以通过使用Dependency Management Plugin来完成。

build.gradle.

  1. plugins {
  2. id "io.spring.dependency-management" version "1.0.6.RELEASE"
  3. }
  4. dependencyManagement {
  5. imports {
  6. mavenBom 'org.springframework.security:spring-security-bom:5.2.0.M1'
  7. }
  8. }

最简单的Spring Security Maven依赖项通常如下所示:

build.gradle.

  1. dependencies {
  2. compile "org.springframework.security:spring-security-web"
  3. compile "org.springframework.security:spring-security-config"
  4. }

如果您正在使用LDAP,OpenID等其他功能,则还需要包含相应的第4章“项目模块”。

Spring Security针对Spring Framework 5.1.4.RELEASE构建,但通常应该适用于任何较新版本的Spring Framework 5.x许多用户将遇到的问题是Spring Security的传递依赖性解决了Spring Framework 5.1.4.RELEASE,这可能会导致 奇怪的类路径问题。 解决此问题的最简单方法是在pom.xml的<dependencyManagement>部分中使用spring-framework-bom,如下所示:这可以通过使用Dependency Management Plugin来完成。

build.gradle.

  1. plugins {
  2. id "io.spring.dependency-management" version "1.0.6.RELEASE"
  3. }
  4. dependencyManagement {
  5. imports {
  6. mavenBom 'org.springframework:spring-framework-bom:5.1.4.RELEASE'
  7. }
  8. }

这将确保Spring Security的所有传递依赖项都使用Spring 5.1.4.RELEASE模块。

Gradle存储库

所有GA版本(即以.RELEASE结尾的版本)都部署到Maven Central,因此使用mavenCentral()存储库足以支持GA版本。

build.gradle.

  1. repositories {
  2. mavenCentral()
  3. }

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

build.gradle.

  1. repositories {
  2. maven { url 'https://repo.spring.io/snapshot' }
  3. }

如果您使用里程碑或候选版本,则需要确保已定义Spring Milestone存储库,如下所示:

build.gradle.

  1. repositories {
  2. maven { url 'https://repo.spring.io/milestone' }
  3. }

4.项目模块

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

4.1核心 - spring-security-core.jar

包含核心身份验证和access-contol类和接口,远程支持和基本配置API。任何使用Spring Security的应用程序都需要。支持独立应用程序,远程客户端,方法(服务层)安全性和JDBC用户配置。包含顶级包:

  • org.springframework.security.core
  • org.springframework.security.access
  • org.springframework.security.authentication
  • org.springframework.security.provisioning

4.2远程处理 - spring-security-remoting.jar

提供与Spring Remoting的集成。除非您正在编写使用Spring Remoting的远程客户端,否则您不需要这样做。主要包是org.springframework.security.remoting

4.3 Web - spring-security-web.jar

包含过滤器和相关的Web安全基础结构代码。任何具有servlet API依赖性的东西。如果您需要Spring Security Web身份验证服务和基于URL的访问控制,则需要它。主要包是org.springframework.security.web

4.4配置 - spring-security-config.jar

包含安全命名空间解析代码和Java配置代码。如果您使用Spring Security XML命名空间进行配置或Spring Security的Java配置支持,则需要它。主要包是org.springframework.security.config。这些类都不打算直接用于应用程序。

4.5 LDAP - spring-security-ldap.jar

LDAP身份验证和配置代码。如果需要使用LDAP身份验证或管理LDAP用户条目,则为必需。顶级包是org.springframework.security.ldap

4.6 OAuth 2.0核心 - spring-security-oauth2-core.jar

spring-security-oauth2-core.jar包含为OAuth 2.0授权框架OpenID Connect Core 1.0提供支持的核心类和接口。使用OAuth 2.0OpenID Connect Core 1.0的应用程序(例如客户端,资源服务器和授权服务器)需要它。顶级包是org.springframework.security.oauth2.core

4.7 OAuth 2.0客户端 - spring-security-oauth2-client.jar

spring-security-oauth2-client.jar是Spring Security对OAuth 2.0授权框架OpenID Connect Core 1.0的客户端支持。应用程序需要利用OAuth 2.0登录和/或OAuth客户端支持。顶级包是org.springframework.security.oauth2.client

4.8 OAuth 2.0 JOSE - spring-security-oauth2-jose.jar

spring-security-oauth2-jose.jar包含Spring Security对JOSE(Javascript对象签名和加密)框架的支持。的圣何塞框架旨在提供安全地传输双方之间的权利要求的方法。它由一系列规范构建:

  • JSON Web令牌(JWT)
  • JSON Web签名(JWS)
  • JSON Web加密(JWE)
  • JSON Web Key(JWK)

它包含顶级包:

  • org.springframework.security.oauth2.jwt
  • org.springframework.security.oauth2.jose

4.9 ACL - spring-security-acl.jar

专门的域对象ACL实现。用于将安全性应用于应用程序中的特定域对象实例。顶级包是org.springframework.security.acls

4.10 CAS - spring-security-cas.jar

Spring Security的CAS客户端集成。如果要将CAS安全Web身份验证与CAS单一登录服务器一起使用。顶级包是org.springframework.security.cas

4.11 OpenID - spring-security-openid.jar

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

4.12测试 - spring-security-test.jar

支持使用Spring Security进行测试。

5.样本申请

项目提供了几个示例Web应用程序。为避免过大的下载,分发zip文件中仅包含“教程”和“联系人”示例。其他可以直接从您可以获得的源构建,如简介中所述。自己构建项目很容易,项目网站上有更多关于http://spring.io/spring-security/的信息。本章中提到的所有路径都与项目源目录相关。

5.1教程样本

教程示例是一个很好的基本示例,可帮助您入门。它始终使用简单的命名空间配置 已编译的应用程序包含在分发zip文件中,可以部署到您的Web容器(spring-security-samples-tutorial-3.1.x.war)中。基于表单的身份验证机制与常用的记住我身份验证提供程序结合使用,以使用cookie自动记住登录。

我们建议您从教程示例开始,因为XML很小且易于遵循。最重要的是,您可以轻松地将这一个XML文件(及其相应的web.xml条目)添加到现有应用程序中。只有在实现此基本集成时,我们才建议您尝试添加方法授权或域对象安全性。

5.2联系人

Contacts Sample是一个高级示例,它说明了除基本应用程序安全性之外的域对象访问控制列表(ACL)的更强大功能。该应用程序提供了一个界面,用户可以使用该界面管理简单的联系人数据库(域对象)。

要进行部署,只需将WAR文件从Spring Security发行版复制到容器的webapps目录中即可。应该调用战争spring-security-samples-contacts-3.1.x.war(附加的版本号将根据您使用的版本而有所不同)。

启动容器后,检查应用程序是否可以加载。访问http:// localhost:8080 / contacts(或适用于您的Web容器和您部署的WAR的URL)。

接下来,单击“调试”。系统将提示您进行身份验证,并在该页面上建议一系列用户名和密码。只需使用其中任何一个进行身份验证即可查看生成的页面。它应包含类似于以下内容的成功消息:

  1. Security Debug Information
  2. Authentication object is of type:
  3. org.springframework.security.authentication.UsernamePasswordAuthenticationToken
  4. Authentication object as a String:
  5. org.springframework.security.authentication.UsernamePasswordAuthenticationToken@1f127853:
  6. Principal: org.springframework.security.core.userdetails.User@b07ed00: Username: rod; \
  7. Password: [PROTECTED]; Enabled: true; AccountNonExpired: true;
  8. credentialsNonExpired: true; AccountNonLocked: true; \
  9. Granted Authorities: ROLE_SUPERVISOR, ROLE_USER; \
  10. Password: [PROTECTED]; Authenticated: true; \
  11. Details: org.springframework.security.web.authentication.WebAuthenticationDetails@0: \
  12. RemoteIpAddress: 127.0.0.1; SessionId: 8fkp8t83ohar; \
  13. Granted Authorities: ROLE_SUPERVISOR, ROLE_USER
  14. Authentication object holds the following granted authorities:
  15. ROLE_SUPERVISOR (getAuthority(): ROLE_SUPERVISOR)
  16. ROLE_USER (getAuthority(): ROLE_USER)
  17. Success! Your web filters appear to be properly configured!

成功收到上述消息后,返回示例应用程序的主页并单击“管理”。然后,您可以试用该应用程序。请注意,仅显示当前登录用户可用的联系人,并且只有具有ROLE_SUPERVISOR删除其联系人权限的用户才能访问。在幕后,MethodSecurityInterceptor正在保护业务对象。

该应用程序允许您修改与不同联系人关联的访问控制列表。请务必通过查看应用程序上下文XML文件来尝试并了解其工作原理。

5.3 LDAP示例

LDAP示例应用程序提供基本配置,并使用传统bean在同一应用程序上下文文件中设置命名空间配置和等效配置。这意味着在此应用程序中实际配置了两个相同的身份验证提供程

5.4 OpenID示例

OpenID示例演示了如何使用命名空间配置OpenID以及如何为Google,Yahoo和MyOpenID身份提供商设置属性交换配置(如果您愿意,可以尝试添加其他配置)。它使用基于JQuery的openid-selector项目来提供用户友好的登录页面,允许用户轻松选择提供者,而不是输入完整的OpenID标识符。

该应用程序与普通身份验证方案的不同之处在于,它允许任何用户访问该站点(前提是他们的OpenID身份验证成功)。第一次登录时,您将收到“欢迎[您的姓名]”消息。如果您注销并重新登录(具有相同的OpenID标识),则应更改为“欢迎回来”。这是通过使用custom UserDetailsService为任何用户分配标准角色并在内部将身份存储在地图中。显然,真正的应用程序会使用数据库。请查看源表单中的更多信息。此类还考虑了不同属性可能的事实从不同的提供程序返回并构建相应地向用户发出的名称。

5.5 CAS样品

CAS示例要求您同时运行CAS服务器和CAS客户端。它不包含在发布包里,你的描述应该检查项目代码的介绍。您将在sample/cas目录下找到相关文件。还有一个Readme.txt文件可以解释如何直接从源代码树运行服务器和客户端,并提供SSL支持。

5.6 JAAS样本

JAAS示例是如何在Spring Security中使用JAAS LoginModule的非常简单的示例。如果用户名等于密码,则提供的LoginModule将成功验证用户,否则抛出LoginException。本示例中使用的AuthorityGranter始终授予角色ROLE_USER。示例应用程序还演示了如何通过将jaas-api-provision设置为“true” 来作为LoginModule返回的JAAS Subject运行。

5.7预认证样本

此示例应用程序演示了如何从预身份验证框架中连接bean 以使用来自Java EE容器的登录信息。用户名和角色是容器设置的用户名和角色。

代码在samples/preauth