"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Spring의 @Secured Annotation을 사용한 메서드 보안

Spring의 @Secured Annotation을 사용한 메서드 보안

2024-07-31에 게시됨
검색:679

Method security with @Secured Annotation in Spring

이 주석은 비즈니스 메서드에 보안 구성을 추가하는 방법을 제공합니다.

역할을 사용하여 사용자에게 이 메소드를 호출할 권한이 있는지 확인합니다. 주석은 스프링 보안의 일부입니다. 따라서 이를 사용하려면 스프링 보안 종속성이 필요합니다.

예시 시나리오

제품 CRUD가 있는 애플리케이션이 있습니다. 이 CRUD에서는 두 가지 특정 역할을 사용하여 작업을 제어하려고 합니다.

  • 사용자:는 제품을 생성하고 제품을 볼 수 있습니다. 하지만 제품을 업데이트하거나 삭제할 수는 없습니다.
  • 관리자: 모든 사용자 작업을 수행할 수 있고 제품을 업데이트하고 삭제할 수도 있습니다.

@Secured를 사용하여 각 작업에서 해당 역할의 액세스를 관리할 수 있습니다.

운영 역할

예제 시나리오에서는 다음 역할을 정의할 수 있습니다.

  • ROLE_USER, ROLE_ADMIN

읽다:

  • ROLE_USER, ROLE_ADMIN

업데이트하려면:

  • ROLE_ADMIN

지우는 것:

  • ROLE_ADMIN

코드 예제를 살펴보고 애플리케이션 동작을 관찰해 보겠습니다.

스프링 보안 종속성 추가

@Secured 주석을 사용하려면 Spring Security에 대한 Maven 종속성을 추가하세요.

org.springframework.bootspring-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
    }
}

애플리케이션 구성

@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.securityspring-security-testtest

그런 다음 모의 사용자를 사용하는지 확인하고 그에게 특정 역할을 할당하는지 확인하는 테스트를 만들고, 각 역할의 사용자와 애플리케이션이 어떻게 작동하는지 테스트할 수 있습니다. 이를 통해 올바른 역할만 허용된 작업을 수행할 수 있도록 할 수 있습니다.

@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에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3