이 주석은 비즈니스 메서드에 보안 구성을 추가하는 방법을 제공합니다.
역할을 사용하여 사용자에게 이 메소드를 호출할 권한이 있는지 확인합니다. 주석은 스프링 보안의 일부입니다. 따라서 이를 사용하려면 스프링 보안 종속성이 필요합니다.
제품 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 } }
@Secured를 사용하여 메소드 보안 활성화를 사용하도록 Spring 애플리케이션을 구성하려면 @EnableGlobalMethodSecurity(securedEnabled = true)를 추가해야 합니다.
@SpringBootApplication @EnableTransactionManagement @EnableGlobalMethodSecurity(securedEnabled = true) public class MasteryApplication { public static void main(String[] args) { SpringApplication.run(MasteryApplication.class, args); } }
이 예에서는 테스트를 사용하여 동작을 테스트하므로 스프링 부트 테스트 종속성을 추가합니다.
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