此註解提供了一種向業務方法添加安全配置的方法。
它將使用角色來檢查使用者是否有權呼叫此方法。註解是 Spring Security 的一部分。因此,要啟用它的使用,您需要 spring security 依賴項。
您有一個具有產品 CRUD 的應用程式。在此 CRUD 中,您希望使用兩個特定角色來控制操作。
您可以使用@Secured 來管理這些角色對每個操作的存取權。
我們可以在範例場景中定義以下角色。
閱讀:
更新:
刪除:
讓我們來看一個程式碼範例並觀察應用程式的行為。
要使用 @Secured 註釋,請新增 Spring Security 的 Maven 依賴項:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
我們使用 @Secured 註解方法,定義哪些角色可以存取方法行為。
public class Product { private Long id; private String name; private BigDecimal value; //getters and setters } @Service public class ProductService { @Secured({"ROLE_USER", "ROLE_ADMIN"}) public Product createProduct(Product product) { // Logic for creating a product return product; } @Secured({"ROLE_USER", "ROLE_ADMIN"}) public Product getProductById(Long id) { // Logic for fetching a product return null; } @Secured("ROLE_ADMIN") public Product updateProduct(Product product) { // Logic for updating a product return product; } @Secured("ROLE_ADMIN") public void deleteProduct(Long id) { // Logic for deleting a product } }
您需要新增@EnableGlobalMethodSecurity(securedEnabled = true)來設定您的Spring應用程式以使用@Secured啟用方法安全性。
@SpringBootApplication @EnableTransactionManagement @EnableGlobalMethodSecurity(securedEnabled = true) public class MasteryApplication { public static void main(String[] args) { SpringApplication.run(MasteryApplication.class, args); } }
在我們的範例中,我們將使用測試來測試行為,因此我們新增 Spring Boot 測試依賴項。
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>
然後我們建立測試來驗證是否使用模擬使用者並為其分配特定角色,我們可以測試每個角色中的使用者以及我們的應用程式的行為。透過這樣做,我們可以確保只有正確的角色才能執行允許的操作。
@SpringBootTest class ProductServiceTests { @Autowired private ProductService productService; @Test @WithMockUser(roles = "USER") void testCreateProductAsUser() { Product product = new Product(); assertDoesNotThrow(() -> productService.createProduct(product)); } @Test @WithMockUser(roles = "ADMIN") void testCreateProductAsAdmin() { Product product = new Product(); assertDoesNotThrow(() -> productService.createProduct(product)); } @Test @WithAnonymousUser void testCreateProductAsAnonymous() { Product product = new Product(); assertThrows(AccessDeniedException.class, () -> productService.createProduct(product)); } @Test @WithMockUser(roles = "USER") void testGetProductByIdAsUser() { assertDoesNotThrow(() -> productService.getProductById(1L)); // Assuming product with ID 1 exists } @Test @WithMockUser(roles = "ADMIN") void testGetProductByIdAsAdmin() { assertDoesNotThrow(() -> productService.getProductById(1L)); } @Test @WithAnonymousUser void testGetProductByIdAsAnonymous() { assertThrows(AccessDeniedException.class, () -> productService.getProductById(1L)); } @Test @WithMockUser(roles = "USER") void testUpdateProductAsUser() { Product product = new Product(); assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product)); } @Test @WithMockUser(roles = "ADMIN") void testUpdateProductAsAdmin() { Product product = new Product(); assertDoesNotThrow(() -> productService.updateProduct(product)); } @Test @WithAnonymousUser void testUpdateProductAsAnonymous() { Product product = new Product(); assertThrows(AccessDeniedException.class, () -> productService.updateProduct(product)); } @Test @WithMockUser(roles = "USER") void testDeleteProductAsUser() { assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L)); } @Test @WithMockUser(roles = "ADMIN") void testDeleteProductAsAdmin() { assertDoesNotThrow(() -> productService.deleteProduct(1L)); } @Test @WithAnonymousUser void testDeleteProductAsAnonymous() { assertThrows(AccessDeniedException.class, () -> productService.deleteProduct(1L)); } }
就是這樣,現在您可以使用帶有 @Secured 註解的角色來管理使用者對應用程式的存取。
如果你喜歡這個主題,記得追蹤我。在接下來的幾天裡,我將詳細解釋 Spring 註解!敬請期待!
跟我來!
以上是Spring 中使用 @Secured 註解的方法安全性的詳細內容。更多資訊請關注PHP中文網其他相關文章!