此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Data REST 5.0.4spring-doc.cadn.net.cn

安全

Spring Data REST 与 Spring Security 配合得非常好。本节展示了如何使用方法级安全机制来保护您的 Spring Data REST 服务的示例。spring-doc.cadn.net.cn

@Pre@Post安全

以下示例来自 Spring Data REST 的测试套件,展示了 Spring Security 的预授权(PreAuthorization)模型(最复杂的安全模型):spring-doc.cadn.net.cn

示例 1. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/PreAuthorizedOrderRepository.java
@PreAuthorize("hasRole('ROLE_USER')") (1)
public interface PreAuthorizedOrderRepository extends CrudRepository<Order, UUID> {

	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@Override
	Optional<Order> findById(UUID id);

	@PreAuthorize("hasRole('ROLE_ADMIN')") (2)
	@Override
	void deleteById(UUID aLong);

	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@Override
	void delete(Order order);

	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@Override
	void deleteAll(Iterable<? extends Order> orders);

	@PreAuthorize("hasRole('ROLE_ADMIN')")
	@Override
	void deleteAll();
}
1 该 Spring Security 注解用于保护整个仓库。其中的 Spring Security SpEL 表达式 表示主体(principal)的角色集合中必须包含 ROLE_USER
2 要更改方法级别的设置,您必须重写方法签名并应用一个 Spring Security 注解。在此情况下,该方法会覆盖仓库级别的设置,要求用户必须拥有 ROLE_ADMIN 角色才能执行删除操作。

前面的示例展示了一个标准的 Spring Data 仓库定义,该定义扩展了 CrudRepository,并做了一些关键改动:为访问各个方法指定了特定的角色:spring-doc.cadn.net.cn

仓库级别和方法级别的安全设置不会叠加。相反,方法级别的设置会覆盖仓库级别的设置。

前面的示例说明,CrudRepository 实际上有四个删除方法。您必须重写所有删除方法,才能正确地对其进行保护。spring-doc.cadn.net.cn

@Secured 安全

以下示例展示了 Spring Security 较早的 @Secured 注解,该注解纯粹基于角色:spring-doc.cadn.net.cn

示例 2. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecuredPersonRepository.java
@Secured("ROLE_USER") (1)
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface SecuredPersonRepository extends CrudRepository<Person, UUID> {

	@Secured("ROLE_ADMIN") (2)
	@Override
	void deleteById(UUID aLong);

	@Secured("ROLE_ADMIN")
	@Override
	void delete(Person person);

	@Secured("ROLE_ADMIN")
	@Override
	void deleteAll(Iterable<? extends Person> persons);

	@Secured("ROLE_ADMIN")
	@Override
	void deleteAll();
}
1 这会产生与前一个示例相同的安全检查,但灵活性较低。它仅允许使用角色作为限制访问的手段。
2 同样,这表明删除方法需要 ROLE_ADMIN 权限。
如果你是从一个新项目开始,或者首次应用 Spring Security,推荐使用 @PreAuthorize。如果你已经在应用程序的其他部分使用了 Spring Security 的 @Secured,则可以继续沿用该方式,而无需重写所有代码。

启用方法级安全

要配置方法级安全性,以下是来自 Spring Data REST 测试套件的一段简短代码示例:spring-doc.cadn.net.cn

示例 3. spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecurityConfiguration.java
@Configuration (1)
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true) (2)
class SecurityConfiguration { (3)
	...
}
1 这是一个 Spring 配置类。
2 它使用 Spring Security 的 @EnableGlobalMethodSecurity 注解来同时启用 @Secured 以及 @Pre/@Post 支持。注意:你不必同时使用两者。此处的特定示例用于证明这两个版本都能与 Spring Data REST 配合使用。
3 该类扩展了 Spring Security 的 WebSecurityConfigurerAdapter,用于纯 Java 方式配置安全功能。

其余的配置类未在此列出,因为它遵循了标准实践,您可以在 Spring Security 参考文档中阅读相关内容。spring-doc.cadn.net.cn