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