このアノテーションは、ビジネス メソッドにセキュリティ構成を追加する方法を提供します。
ロールを使用して、ユーザーがこのメソッドを呼び出す権限を持っているかどうかを確認します。注釈は Spring セキュリティの一部です。したがって、その使用を有効にするには、Spring セキュリティ依存関係が必要です。
製品 CRUD を含むアプリケーションがあります。この CRUD では、2 つの特定のロールを使用して操作を制御したいと考えています。
@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) を追加して、@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 アノテーションについて詳しく説明します。乞うご期待!
私に従ってください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3