«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Безопасность метода с помощью аннотации @Secured в Spring

Безопасность метода с помощью аннотации @Secured в Spring

Опубликовано 31 июля 2024 г.
Просматривать:782

Method security with @Secured Annotation in Spring

Эта аннотация позволяет добавить конфигурацию безопасности к бизнес-методам.

Он будет использовать роли, чтобы проверить, есть ли у пользователя разрешение на вызов этого метода. Аннотация является частью весенней безопасности. Поэтому, чтобы включить его использование, вам нужна зависимость безопасности Spring.

Пример сценария

У вас есть приложение с продуктом CRUD. В этом CRUD вы хотите управлять операциями, используя две конкретные роли.

  • Пользователь: может создать продукт и просмотреть его. Но не могу обновить или удалить продукт.
  • Администратор: который может выполнять все пользовательские операции, а также может обновлять и удалять продукт.

Вы можете использовать @Secured для управления доступом этих ролей при каждой операции.

Роли для операций

В нашем примере сценария мы можем определить следующие роли.

  • ROLE_USER, ROLE_ADMIN

Читать:

  • ROLE_USER, ROLE_ADMIN

Обновить:

  • ROLE_ADMIN

Удалить:

  • ROLE_ADMIN

Давайте рассмотрим пример кода и понаблюдаем за поведением приложения.

Добавление зависимости безопасности Spring

Чтобы работать с аннотацией @Secured, добавьте зависимость Maven для Spring Security:


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

Конфигурация приложения

Вам необходимо добавить @EnableGlobalMethodSecurity(securedEnabled = true), чтобы настроить приложение Spring для использования метода включения безопасности с использованием @Secured.

@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! Следите за обновлениями!

Подписывайтесь на меня!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/tiuwill/method-security-with-secured-annotation-in-spring-1hgk?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3