安全

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 註解可保護整個儲存庫。Spring Security SpEL 表示式 指示主體在其角色集合中必須具有 ROLE_USER
2 要更改方法級設定,您必須重寫方法簽名並應用 Spring Security 註解。在這種情況下,該方法會覆蓋儲存庫級設定,要求使用者擁有 ROLE_ADMIN 才能執行刪除操作。

前面的示例顯示了一個標準的 Spring Data 儲存庫定義,它擴充套件了 CrudRepository,並進行了一些關鍵更改:為訪問各種方法指定了特定的角色。

儲存庫和方法級別安全設定不組合。相反,方法級別設定會覆蓋儲存庫級別設定。

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

啟用方法級安全性

要配置方法級安全性,這裡是 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 參考文件中閱讀到的 標準實踐

© . This site is unofficial and not affiliated with VMware.