首頁 > Java > java教程 > 主體

Spring 中使用 @Secured 註解的方法安全性

王林
發布: 2024-07-19 02:37:10
原創
577 人瀏覽過

Method security with @Secured Annotation in Spring

此註解提供了一種向業務方法添加安全配置的方法。

它將使用角色來檢查使用者是否有權呼叫此方法。註解是 Spring Security 的一部分。因此,要啟用它的使用,您需要 spring security 依賴項。

範例場景

您有一個具有產品 CRUD 的應用程式。在此 CRUD 中,您希望使用兩個特定角色來控制操作。

  • 使用者:可以建立產品並查看產品。但無法更新或刪除產品。
  • 管理員:可以執行所有使用者操作,也可以更新和刪除產品。

您可以使用@Secured 來管理這些角色對每個操作的存取權。

營運角色

我們可以在範例場景中定義以下角色。

  • ROLE_USER、ROLE_ADMIN

閱讀:

  • ROLE_USER、ROLE_ADMIN

更新:

  • ROLE_ADMIN

刪除:

  • ROLE_ADMIN

讓我們來看一個程式碼範例並觀察應用程式的行為。

新增 Spring Security 依賴

要使用 @Secured 註釋,請新增 Spring Security 的 Maven 依賴項:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
登入後複製

使用@Secured註解方法

我們使用 @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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!