Эта аннотация позволяет добавить конфигурацию безопасности к бизнес-методам.
Он будет использовать роли, чтобы проверить, есть ли у пользователя разрешение на вызов этого метода. Аннотация является частью весенней безопасности. Поэтому, чтобы включить его использование, вам нужна зависимость безопасности Spring.
У вас есть приложение с продуктом CRUD. В этом CRUD вы хотите управлять операциями, используя две конкретные роли.
Вы можете использовать @Secured для управления доступом этих ролей при каждой операции.
В нашем примере сценария мы можем определить следующие роли.
Читать:
Обновить:
Удалить:
Давайте рассмотрим пример кода и понаблюдаем за поведением приложения.
Чтобы работать с аннотацией @Secured, добавьте зависимость Maven для Spring Security:
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), чтобы настроить приложение 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! Следите за обновлениями!
Подписывайтесь на меня!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3