SpringSecurity中文文档(前置-Maven导入SpringSecurity)

前置(Prerequisites)

Spring Security6.3 需要 Java 8或更高的运行时环境。

因为 SpringSecurity 的目标是以自包含的方式进行操作,您不需要在Java运行环境中放置任何特殊的配置文件。特别是,您不需要配置一个特殊的Java认证和授权服务(JAAS)策略文件,也不需要将 Spring Security 放入常见的类路径位置。

类似地,如果使用 EJB 容器或 Servlet 容器,您不需要将任何特殊的配置文件放在任何地方,也不需要在服务器类加载器中包含 Spring Security。所有必需的文件都包含在应用程序中。

这种设计提供了最大的部署时间灵活性,因为您可以将目标工件(可以是 JAR、 WAR 或 EAR)从一个系统复制到另一个系统,并且它立即可以工作。

Spring Security 6.3的新特性

Spring Security 6.3提供了许多新特性。以下是本次发布的亮点,或者您可以查看每个特性和 bug 修复的详细列表的发布说明。

JDK 序列化支持的兼容性

当涉及到对 JDK 序列化安全组件的支持时,SpringSecurity 在历史上一直非常积极,只支持一个 SpringSecurity 次要版本的每个序列化版本。这意味着,如果您拥有 JDK 序列化的安全组件,那么在升级到下一个 Spring Security 版本之前,需要撤消它们,因为它们不再是可反序列化的。

现在 Spring Security 每六个月发布一个小版本,这变成了一个更大的痛点。现在Spring Security每六个月进行一次小版本更新,这使得升级变得更加痛苦。为了解决这个问题,Spring Security现在将保持与JDK序列化的兼容性,就像它对JSON序列化所做的那样,使升级更加无缝。

Authorization(授权)

最近几个版本的主题是重构和改进 Spring Security 的授权子系统。从用 AuthorizationManager 替换 AccessDecisionManager API 开始,现在我们可以添加一些令人兴奋的新特性。

注解参数(Annotation Parameters)- #14480

第一个6.3特性是对注释参数的支持。考虑 Spring Security 对元注释的支持,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_message:read')")
public @interface HasMessageRead {}

在这个版本之前,只有当它在整个代码库中被广泛使用时,这样的东西才有用。但是现在,您可以像这样添加参数:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@PreAuthorize("hasAuthority('SCOPE_{scope}')")
public @interface HasScope {
	String scope();
}

使这样的事情成为可能:

@HasScope("message:read")
public String method() { ... }

并在更多的地方应用你的 SpEL 表达式。

安全返回值(Secure Return Values) - #14596, #14597

自从早期的Spring Security,您已经能够使用@PreAuthorize 和@PostAuthorize 对 Spring bean 进行注释。

但是controllers, services, and repositories并不是您唯一需要保护的东西。例如,域对象 Order,其中只有管理员才能调用 Order # getPay 方法?

public class Order {

	@HasScope("payment:read")
	Payment getPayment() { ... }

}

然后使用@AuthorizeReturn 对象对 Spring Data 存储库进行注释,如下所示:

public interface OrderRepository implements CrudRepository<Order, String> {

	@AuthorizeReturnObject
	Optional<Order> findOrderById(String id);

}

此时,Spring Security 将通过代理 Order 实例来保护从 findOrderById 返回的任何 Order。

错误处理(Error Handling) - #14598, #14600, #14601

在此版本中,您还可以使用其最新的新方法安全注释在方法级别拦截和处理故障。

当您使用@HandleAuthorizationDenied 这样注释一个方法时:

public class Payment {
    @HandleAuthorizationDenied(handlerClass=Mask.class)
    @PreAuthorize("hasAuthority('card:read')")
    public String getCreditCardNumber() { ... }
}

并发布一个 Mask bean:

@Component
public class Mask implements MethodAuthorizationDeniedHandler {
	@Override
    public Object handleDeniedInvocation(MethodInvocation invocation, AuthorizationResult result) {
		return "***";
    }
}

然后任何未经授权的调用Payment # getCreditCardNumber 将返回 * * * 而不是该号码。

已泄露的密码检查(Compromised Password Checking) - #7395

如果要让用户选择密码,确保这样的密码没有被泄露是至关重要的。Spring Security 6.3 将此简化为发布一个 CompromisedPasswordChecker bean。

@Bean
public CompromisedPasswordChecker compromisedPasswordChecker() {
    return new HaveIBeenPwnedRestApiPasswordChecker();
}

spring-security-rsa 现在是Spring Security的一部分 - #14202

Spring Security 一直在进行一项长期的倡议,将各种 Spring Security 扩展合并到 Spring Security 中。在6.3中,spring-security-rsa 成为这些项目中最新的一个,它将帮助团队长期维护和添加特性。

Spring-security-rsa 提供了许多方便的 BytesEncryptor 实现以及用于使用 KeyStores 的更简单的 API。

令牌交换授权(OAuth 2.0 Token Exchange Grant) - #5199

Spring Security 中最受欢迎的 OAuth 2.0特性之一已经在6.3中发布,这是对 OAuth 2.0令牌交换授权的支持。

对于为令牌交换配置的任何客户端,您可以在 Spring Security 中激活它,方法是向 OAuth2AuthorizedClientManager 添加一个 TokenExchangeAuthorizedClientProvider 实例,如下所示:

@Bean
public OAuth2AuthorizedClientProvider tokenExchange() {
	return new TokenExchangeOAuth2AuthorizedClientProvider();
}

然后像往常一样使用@RegisteredOAuth2AuthorizedClient 注释检索具有扩展的资源服务器所需特权的适当令牌。

其他亮点(Additional Highlights)

  • gh-14655 - Add DelegatingAuthenticationConverter
  • gh-6192 - Add Concurrent Sessions Control(并发会话控制) on WebFlux (docs)
  • gh-14193 - Added support for CAS Gateway Authentication(CAS 网关身份验证)
  • gh-13259 - Customize when UserInfo is called(调用 UserInfo 时自定义)
  • gh-14168 - Introduce Customizable AuthorizationFailureHandler in OAuth2AuthorizationRequestRedirectFilter(在 OAuth2AuthorizationRequestRedirectFilter 中引入可定制的 AuthorizationfalureHandler)
  • gh-14672 - Customize mapping the OidcUser from OidcUserRequest and OidcUserInfo(从 OidcUserRequest 和 OidcUserInfo 自定义映射 OidcUser)
  • gh-13763 - Simplify configuration of reactive OAuth2 Client component model(简化响应式 OAuth2客户端组件模型的配置)
  • gh-14758 - Update reactive OAuth2 docs landing page with examples (docs)(用示例更新响应式 OAuth2文档登录页面)
  • gh-10538 - Support Certificate-Bound JWT Access Token Validation(支持绑定证书的 JWT 访问令牌验证)
  • gh-14265 - Support Nested username in UserInfo response(在 UserInfo 响应中支持嵌套用户名)
  • gh-14449 - Add SecurityContext argument resolver(添加 SecurityContext 参数解析器)
  • gh-11440 - Simplify Disabling application/x-www-form-urlencoded Encoding Client ID and Secret (servlet docs, reactive docs)(简化禁用application/x-www-form-urlencode 编码客户端 ID 和 Secret)

Getting Spring Security

本节描述如何获取 Spring Security二进制文件。有关如何获取源代码的信息,请参见 Source Code

发行编号(Release Numbering)

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

  • MAJOR 版本可能包含重大更改。这些都是为了提供更好的安全性来匹配现代安全实践。
  • MINOR 版本包含增强,但被认为是被动更新。
  • PATCH 级别应该是完全兼容的,向前和向后兼容,修复 bug 的更改可能例外。

使用Maven(Usage with Maven)

作为大多数开源项目,SpringSecurity 将其依赖项部署为 Maven 构件。本节中的主题描述如何在使用 Maven 时使用 Spring Security。

Spring Boot with Maven

Spring Boot 提供了一个 Spring-Boot-starter-security starter,用于聚合与 Spring Security 相关的依赖项。使用 starter 的最简单和首选方法是通过在(Eclipse 或 IntelliJ,NetBeans)中使用 IDE 集成或通过 start.Spring.io 使用 Spring Initializr。或者,您可以手动添加启动器,如下面的示例所示:

<dependencies>
	<!-- ... other dependency elements ... -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>
</dependencies>

由于 SpringBoot 提供了一个 MavenBOM 来管理依赖版本,因此不需要指定版本。如果希望重写 Spring Security 版本,可以通过提供 Maven 属性来实现:

<properties>
	<!-- ... -->
	<spring-security.version>6.3.0</spring-security.version>
</properties>

由于 SpringSecurity 只在主要版本(major releases)中进行破坏性更改,所以您可以安全地使用 SpringBoot 的新版本的 SpringSecurity。但是,有时可能还需要更新 SpringFramework 的版本。可以通过添加 Maven 属性来实现:

<properties>
	<!-- ... -->
	<spring-security.version>6.3.0</spring-security.version>
</properties>

如果使用其他特性(如 LDAP、 OAuth 2和其他特性) ,还需要包括适当的项目模块和依赖项(Project Modules and Dependencies.)。

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值