安全

Spring Data REST 与 Spring Security 配合良好。本节展示了如何使用方法级安全来保护您的 Spring Data REST 服务的示例。

@Pre@Post 安全

以下来自 Spring Data REST 测试套件的示例展示了 Spring Security 的 预授权模型(最复杂的安全性模型)

示例 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 表达式 指示主体必须在其角色集合中具有 ROLE_USER
2 要更改方法级设置,您必须覆盖方法签名并应用 Spring Security 注解。在本例中,该方法使用用户必须具有 ROLE_ADMIN 才能执行删除的要求来覆盖存储库级设置。

前面的示例展示了标准的 Spring Data 存储库定义,它扩展了 CrudRepository,并进行了一些关键更改:指定特定角色以访问各种方法

存储库和方法级安全性设置不会合并。相反,方法级设置会覆盖存储库级设置。

前面的示例说明了 CrudRepository 实际上有四种删除方法。您必须覆盖所有删除方法才能正确保护它。

@Secured 安全性

以下示例展示了 Spring Security 的较旧的 @Secured 注解,它纯粹基于角色

示例 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 测试套件中的简短代码段

示例 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 参考文档中阅读。