「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Spring の @Secured アノテーションを使用したメソッドのセキュリティ

Spring の @Secured アノテーションを使用したメソッドのセキュリティ

2024 年 7 月 31 日に公開
ブラウズ:979

Method security with @Secured Annotation in Spring

このアノテーションは、ビジネス メソッドにセキュリティ構成を追加する方法を提供します。

ロールを使用して、ユーザーがこのメソッドを呼び出す権限を持っているかどうかを確認します。注釈は Spring セキュリティの一部です。したがって、その使用を有効にするには、Spring セキュリティ依存関係が必要です。

シナリオ例

製品 CRUD を含むアプリケーションがあります。この CRUD では、2 つの特定のロールを使用して操作を制御したいと考えています。

  • ユーザー: は製品を作成して製品を表示できます。ただし、商品の更新や削除はできません。
  • 管理者: すべてのユーザー操作を実行でき、製品の更新と削除もできます。

@Secured を使用して、各操作でこれらのロールのアクセスを管理できます。

運用上の役割

このシナリオ例では、次のロールを定義できます。

  • ROLE_USER、ROLE_ADMIN

読むには:

  • ROLE_USER、ROLE_ADMIN

更新するには:

  • ROLE_ADMIN

削除するには:

  • ROLE_ADMIN

コード例を見て、アプリケーションの動作を観察してみましょう。

Spring Securityの依存関係の追加

@Secured アノテーションを使用するには、Spring Security の Maven 依存関係を追加します。


    org.springframework.boot
    spring-boot-starter-security

@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) を追加して、@Secured を使用したイネーブル メソッド セキュリティを使用するように Spring アプリケーションを構成する必要があります。

@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 アノテーションについて詳しく説明します。乞うご期待!

私に従ってください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/tiuwill/method-security-with-secured-annotation-in-spring-1hgk?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3