安全性
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 參考文件中閱讀相關資訊。