安全性

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 註解。在這種情況下,該方法會覆蓋 Repository 級別設定,要求使用者擁有 ROLE_ADMIN 角色才能執行刪除操作。

前面的示例展示了一個標準的 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,它用於純 Java 的安全配置。

配置類的其餘部分沒有列出,因為它遵循了 標準實踐,您可以在 Spring Security 參考文件中閱讀相關內容。