[java] هل يمكن لـ Spring Security استخدامPreAuthorize على أساليب التحكم في الربيع؟


Answers

راجع أسئلة أمان الربيع (التأكيد على الألغام).

في تطبيق ويب الربيع ، غالباً ما يكون سياق التطبيق الذي يحمل الفاصص MVC Spring لمرسل servleter منفصلاً عن سياق التطبيق الرئيسي. غالباً ما يتم تعريفها في ملف يسمى myapp-servlet.xml ، حيث أن "myapp" هو الاسم الذي تم تعيينه لـ Spring DispatcherServlet في web.xml. يمكن أن يحتوي التطبيق على DispatcherServlets متعددة ، لكل منها سياق التطبيق المعزول الخاص به. الفاصوليا في هذه السياقات "الأطفال" غير مرئية لبقية التطبيق. يتم تحميل سياق التطبيق "الأصل" بواسطة ContextLoaderListener الذي تحدده في web.xml الخاص بك ويكون مرئيًا لجميع السياقات الفرعية. هذا السياق الرئيسي هو عادة المكان الذي تحدد فيه توصيف الأمان الخاص بك ، بما في ذلك العنصر). ونتيجة لذلك ، لن يتم فرض أي قيود أمان مطبقة على الأساليب في حبوب الويب هذه ، حيث لا يمكن رؤية الفاصوليا من سياق DispatcherServlet. تحتاج إلى نقل الإعلان إلى سياق الويب أو نقل الفاصوليا التي تريد تأمينها في سياق التطبيق الرئيسي.

بشكل عام ، نوصي بتطبيق أمان الأسلوب في طبقة الخدمة بدلاً من استخدام وحدات تحكم ويب فردية.

إذا قمت بتطبيق الإشارة على طبقة الخدمة فستحتاج فقط إلى تعيين <global-method-security> في سياق أمان التطبيق الخاص بك.

Question

هل يمكن لـ Spring Security استخدام @PreAuthorize على أساليب التحكم في الربيع؟




لتوسيع الإجابة المقدمة من آندي ، يمكنك استخدام:

@PreAuthorize("hasRole('foo')")

للتحقق من دور محدد.




لقد مر أكثر من عامين منذ طرح هذا السؤال ولكن بسبب المشاكل التي واجهتها اليوم ، فأنا أفضل عدم استخدام @Secured ، أو @PreAuthorize ، إلخ. على @Controller .

ما لم يعمل بالنسبة لي كان @Validated جنبا إلى جنب مع @Secured تحكم @Secured :

@Controller
@Secured("ROLE_ADMIN")
public class AdministrationController {

// @InitBinder here...

@RequestMapping(value = "/administration/add-product", method = RequestMethod.POST)
public String addProductPost(@ModelAttribute("product") @Validated ProductDto product, BindingResult bindingResult) {
    // ...
}

المصادقة ببساطة لا تطلق (Spring MVC 4.1.2، Spring Security 3.2.5) ولا يتم إجراء أي فحص.

تحدث مشكلات مشابهة بواسطة بروكسيات CGLIB التي يستخدمها الربيع (عند عدم وجود واجهة يتم تنفيذها من خلال فصل دراسي ، يقوم Spring بإنشاء CGLIB proxy ، وإذا كان الفصل ينفذ أي واجهة ، فيتم إنشاء JDK Proxy - documentation ، يتم شرحه بشكل جيد هنا here ).

كما هو مذكور في الإجابات التي ربطتها أعلاه ، من الأفضل استخدام التعليقات التوضيحية لـ Security Spring على طبقة الخدمة التي تقوم عادة بتنفيذ واجهات (بحيث يتم استخدام JDK Proxies) لأن هذا لا يؤدي إلى مثل هذه المشاكل.

إذا كنت ترغب في تأمين وحدات تحكم ويب ، فإن أفضل فكرة هي استخدام <http> و <intercept-url /> المرتبطين بعناوين URL محددة بدلاً من الأساليب الموجودة في وحدات التحكم والعمل بشكل جيد. في حالتي:

<http use-expressions="true" disable-url-rewriting="true">

    ...

    <intercept-url pattern="/administration/**" access="hasRole('ROLE_ADMIN')" />

</http>





Links