对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data REST 4.3.1Spring中文文档

Spring Data REST与Spring Security配合得很好。本节介绍如何使用方法级安全性保护 Spring Data REST 服务的示例。Spring中文文档

@Pre和安全性@Post

以下来自Spring Data REST测试套件的示例显示了Spring Security的PreAuthorization模型(最复杂的安全模型):Spring中文文档

例 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 存储库定义,其中包含一些关键更改:用于访问各种方法的特定角色的规范:CrudRepositorySpring中文文档

存储库和方法级别安全设置不能组合使用。相反,方法级别设置会覆盖存储库级别设置。

前面的例子说明了 ,实际上有四个删除方法。您必须重写所有删除方法才能正确保护它。CrudRepositorySpring中文文档

1 此 Spring Security 注解可保护整个存储库。Spring Security SpEL 表达式指示主体在其角色集合中必须具有。ROLE_USER
2 若要更改方法级设置,必须覆盖方法签名并应用 Spring Security 注解。在这种情况下,该方法将覆盖存储库级别的设置,并要求用户必须执行删除。ROLE_ADMIN
存储库和方法级别安全设置不能组合使用。相反,方法级别设置会覆盖存储库级别设置。

@Secured安全

以下示例显示了 Spring Security 的旧注释,该注释完全基于角色:@SecuredSpring中文文档

例 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,则推荐使用解决方案。如果已经在应用程序的其他部分中使用了 Spring Security,则可以继续该路径,而无需重写所有内容。@PreAuthorize@Secured
1 这会导致与上一个示例相同的安全检查,但灵活性较低。它只允许角色作为限制访问的手段。
2 同样,这表明删除方法需要 .ROLE_ADMIN
如果您从新项目开始或首先应用 Spring Security,则推荐使用解决方案。如果已经在应用程序的其他部分中使用了 Spring Security,则可以继续该路径,而无需重写所有内容。@PreAuthorize@Secured

启用方法级安全性

要配置方法级安全性,以下是Spring Data REST测试套件中的简短片段:Spring中文文档

例 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 的注解来启用 和 / 支持。注意:您不必同时使用两者。这种特殊情况用于证明这两个版本都适用于Spring Data REST。@EnableGlobalMethodSecurity@Secured@Pre@Post
3 此类扩展了 Spring Security 的 Spring Security,用于安全性的纯 Java 配置。WebSecurityConfigurerAdapter

配置类的其余部分未列出,因为它遵循您可以在 Spring Security 参考文档中阅读的标准做法Spring中文文档

1 这是一个 Spring 配置类。
2 它使用 Spring Security 的注解来启用 和 / 支持。注意:您不必同时使用两者。这种特殊情况用于证明这两个版本都适用于Spring Data REST。@EnableGlobalMethodSecurity@Secured@Pre@Post
3 此类扩展了 Spring Security 的 Spring Security,用于安全性的纯 Java 配置。WebSecurityConfigurerAdapter