此註解提供了一種向業務方法添加安全配置的方法。
它將使用角色來檢查使用者是否有權呼叫此方法。註解是 Spring Security 的一部分。因此,要啟用它的使用,您需要 spring security 依賴項。
您有一個包含產品 CRUD 的應用程式。在此 CRUD 中,您希望使用兩個特定角色來控制操作。
您可以使用@Secured 來管理這些角色對每個操作的存取權。
我們可以在範例場景中定義以下角色。
閱讀:
更新:
刪除:
讓我們來看一個程式碼範例並觀察應用程式的行為。
若要使用 @Secured 註釋,請新增 Spring Security 的 Maven 依賴項:
org.springframework.boot spring-boot-starter-security
我們使用 @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 測試依賴項。
org.springframework.security spring-security-test test
然後我們建立測試來驗證是否使用模擬使用者並為其分配特定角色,我們可以測試每個角色中的使用者以及我們的應用程式的行為。透過這樣做,我們可以確保只有正確的角色才能執行允許的操作。
@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 註解!敬請關注!
跟我來!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3