"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > أمان الطريقة باستخدام التعليق التوضيحيSecured في الربيع

أمان الطريقة باستخدام التعليق التوضيحيSecured في الربيع

تم النشر بتاريخ 2024-07-31
تصفح:454

Method security with @Secured Annotation in Spring

يوفر هذا التعليق التوضيحي طريقة لإضافة تكوين الأمان إلى أساليب العمل.

سيستخدم الأدوار للتحقق مما إذا كان لدى المستخدم إذن للاتصال بهذه الطريقة. التعليق التوضيحي جزء من أمان الربيع. لذا لتمكين استخدامه، فأنت بحاجة إلى تبعية أمان الربيع.

السيناريو المثال

لديك تطبيق يحتوي على منتج CRUD. في هذا CRUD تريد التحكم في العمليات باستخدام دورين محددين.

  • المستخدم: يمكنه إنشاء المنتج ورؤية المنتج. ولكن لا يمكن تحديث أو حذف منتج.
  • المسؤول: يمكنه القيام بجميع عمليات المستخدم ويمكنه أيضًا تحديث المنتج وحذفه.

يمكنك استخدام @Secured لإدارة الوصول إلى تلك الأدوار في كل عملية.

أدوار العمليات

يمكننا تحديد الأدوار التالية في السيناريو الخاص بنا.

  • ROLE_USER، ROLE_ADMIN

ليقرأ:

  • ROLE_USER، ROLE_ADMIN

للتحديث:

  • دور_المسؤول

لحذف:

  • دور_المسؤول

دعونا نلقي نظرة على مثال التعليمات البرمجية ونلاحظ سلوك التطبيق.

إضافة تبعية أمان الربيع

للعمل مع التعليق التوضيحي @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.

إذا أعجبك هذا الموضوع، تأكد من متابعتي. في الأيام التالية، سأشرح المزيد عن تعليقات الربيع! ابقوا متابعين!

اتبعني!

بيان الافراج تم نشر هذه المقالة على: https://dev.to/tiuwill/method-security-with-secured-annotation-in-spring-1hgk?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3