安全性

Spring Data REST 與 Spring Security 搭配運作良好。本節將展示如何使用方法層級安全性來保護您的 Spring Data REST 服務的範例。

@Pre@Post 安全性

以下 Spring Data REST 測試套件中的範例展示了 Spring Security 的 PreAuthorization 模型(最精密的安全性模型)

範例 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 註解保護整個 repository。 Spring Security SpEL 運算式 表示 principal 必須在其角色集合中具有 ROLE_USER
2 若要變更方法層級設定,您必須覆寫方法簽章並套用 Spring Security 註解。在此範例中,此方法使用使用者必須具有 ROLE_ADMIN 才能執行刪除的要求,來覆寫 repository 層級設定。

先前的範例顯示了標準的 Spring Data repository 定義,其擴充了 CrudRepository,並進行了一些主要變更:指定特定角色以存取各種方法

Repository 和方法層級安全性設定不會合併。相反地,方法層級設定會覆寫 repository 層級設定。

先前的範例說明了 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 解決方案。如果您已經在應用程式的其他部分使用具有 @Secured 的 Spring Security,則可以繼續使用該路徑,而無需重寫所有內容。

啟用方法層級安全性

若要設定方法層級安全性,以下是 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,用於 security 的純 Java 設定。

未列出其餘的設定類別,因為它遵循 標準實務,您可以在 Spring Security 參考文件中閱讀相關資訊。