>Java >java지도 시간 >Spring의 @Secured Annotation을 사용한 메서드 보안

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

王林
王林원래의
2024-07-19 02:37:10750검색

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 종속성을 추가하세요.

<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);
    }

}

동작 테스트

이 예에서는 테스트를 사용하여 동작을 테스트하므로 스프링 부트 테스트 종속성을 추가합니다.

<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 Annotation을 사용한 메서드 보안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.