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

王林
リリース: 2024-07-19 02:37:10
オリジナル
742 人が閲覧しました

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 依存関係を追加します。

<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
    }
}
ログイン後にコピー

アプリケーション構成

@Secured を使用してイネーブル メソッド セキュリティを使用するように Spring アプリケーションを構成するには、@EnableGlobalMethodSecurity(securedEnabled = true) を追加する必要があります。

@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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート