[Java] يمكن استخدام الأمن الربيعPreAuthorize على طرق التحكم الربيع؟


Answers

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

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

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

إذا طبقت نقاط نقطة على طبقة الخدمة، فسيلزمك تعيين <global-method-security> غلوبال-ميثود-سيكوريتي <global-method-security> في سياق الأمان لتطبيقك فقط.

Question

يمكن استخدام الأمن الربيع @PreAuthorize على طرق التحكم الربيع؟




هناك بالفعل رد حول كيفية جعله يعمل عن طريق تغيير التكوين شمل، ولكن إذا كنت تعمل مع التكوين القائم على التعليمات البرمجية، يمكنك تحقيق نفس عن طريق وضع التعليق التوضيحي التالي فوق لك فئة @EnableGlobalMethodSecurity(prePostEnabled=true) : @EnableGlobalMethodSecurity(prePostEnabled=true) .




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

ما لم ينجح بالنسبة لي كان @Validated جنبا إلى جنب مع تحكم @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) {
    // ...
}

المصادقة ببساطة لا يطلق النار (الربيع مفك 4.1.2، الربيع الأمن 3.2.5) ويتم تنفيذ أي الشيكات.

تنشأ مشاكل مماثلة عن طريق بروكسيات غليب المستخدمة من قبل الربيع (عندما لا يكون هناك واجهة تنفيذها من قبل فئة، الربيع يخلق وكيل غليب، وإذا كان الطبقة تنفذ أي واجهة ثم يتم إنشاء جدك وكيل - وثائق ، وأوضح بشكل جيد هنا وهنا ).

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

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

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

    ...

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

</http>