2010-06-21 8 views

उत्तर

63

हाँ, यह ठीक काम करता है।

आप ...-servlet.xml में <security:global-method-security pre-post-annotations="enabled" /> की जरूरत है। इसे CGLIB proxies की भी आवश्यकता है, इसलिए आपके नियंत्रकों में इंटरफेस नहीं होना चाहिए, या आपको proxy-target-class = true का उपयोग करना चाहिए।

+1

मैं डाल कि मेरे वसंत सुरक्षा आवेदन के संदर्भ में (मैं पहले से ही यह वास्तव में था), लेकिन वसंत @ नियंत्रक का उपयोग कर नियंत्रकों के साथ कुछ भी नहीं करता है। क्या आपको यह कहने के लिए कुछ भी करना है जो आपने ऊपर और उससे परे काम करने के लिए किया है? – egervari

+13

में मैंने कहा, 'ग्लोबल-विधि-सुरक्षा' डिस्पैचर सर्वलेट के संदर्भ ('...- servlet.xml') में" वसंत सुरक्षा अनुप्रयोग संदर्भ "में नहीं होना चाहिए। – axtavt

+0

धन्यवाद! मैंने इसे स्थानांतरित नहीं किया क्योंकि मैं नहीं देख पा रहा था कि यह विलय क्यों हो जाता है क्योंकि यह विलय हो जाता है ... मुझे लगता है कि यह नहीं हुआ;) अब काम करता है! – egervari

20

देखें Spring Security FAQ (जोर मेरा)।

एक स्प्रिंग वेब अनुप्रयोग में, आवेदन संदर्भ में जो डिस्पैचर सर्वलेट के लिए वसंत MVC सेम रखती अक्सर मुख्य आवेदन संदर्भ से अलग है। इसे अक्सर myapp-servlet.xml नामक फ़ाइल में परिभाषित किया जाता है, जहां "myapp" नाम स्प्रिंग वेबपैक्स में DispatcherServlet को असाइन किया गया नाम है। एक एप्लिकेशन में कई डिस्पैचर सर्विलेट्स हो सकते हैं, प्रत्येक के अपने अलग-अलग एप्लिकेशन संदर्भ के साथ। इन "बच्चे" संदर्भों में सेम एप्लिकेशन के बाकी हिस्सों में दिखाई नहीं दे रहे हैं। "पेरेंट" एप्लिकेशन संदर्भ ContextLoaderListener द्वारा लोड किया गया है जिसे आप अपने web.xml में परिभाषित करते हैं और सभी बच्चे संदर्भों के लिए दृश्यमान है। यह मूल संदर्भ आम तौर पर आपकी सुरक्षा कॉन्फ़िगरेशन को परिभाषित करता है, जिसमें तत्व शामिल हैं)। नतीजतन में विधियों पर लागू कोई भी सुरक्षा बाधाएं इन वेब बीन्स को लागू नहीं किया जाएगा, क्योंकि सेम को डिस्पैचर सर्वलेट संदर्भ से नहीं देखा जा सकता है। आपको वेब संदर्भ में घोषणा को स्थानांतरित करने की आवश्यकता है या बीन्स को मुख्य एप्लिकेशन संदर्भ में सुरक्षित करना चाहते हैं।

आम तौर पर हम व्यक्तिगत वेब नियंत्रकों की बजाय सेवा परत पर विधि सुरक्षा लागू करने की अनुशंसा करेंगे।

आप सेवा परत को pointcuts आवेदन करते हैं तो आप केवल अपने एप्लिकेशन की सुरक्षा के संदर्भ में <global-method-security> सेट करना होगा।

+0

नियंत्रक में @PreAuthorize का उपयोग करने का प्रयास कर रहा था, काम नहीं किया, एक बार जब मैं सेवा परत में चला गया। – MarCrazyness

16

यदि आप स्प्रिंग 3.1 का उपयोग कर रहे हैं, तो आप इसके साथ कुछ सुंदर चीजें कर सकते हैं। https://github.com/mohchi/spring-security-request-mapping पर एक नज़र डालें। यह एक नमूना परियोजना है कि @PreAuthorize वसंत MVC के RequestMappingHandlerMapping के साथ एकीकृत करता है, ताकि आप की तरह कुछ कर सकते हैं:

@RequestMapping("/") 
@PreAuthorize("isAuthenticated()") 
public String authenticatedHomePage() { 
    return "authenticatedHomePage"; 
} 

@RequestMapping("/") 
public String homePage() { 
    return "homePage"; 
} 

के लिए "/" कॉल करेंगे authenticatedHomePage() करता है, तो उपयोगकर्ता को प्रमाणीकृत किया है एक अनुरोध। अन्यथा यह होमपेज() को कॉल करेगा।

9

इस प्रश्न के बाद से दो साल से अधिक हो गया है, लेकिन आज की समस्याओं के कारण मैं @Secured, @PreAuthorize, आदि @Controller पर उपयोग करके हतोत्साहित करना चाहता हूं।

क्या मेरे लिए काम नहीं किया @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) { 
    // ... 
} 

सत्यापनकर्ता बस आग (वसंत MVC 4.1.2, स्प्रिंग सुरक्षा 3.2.5) नहीं है और कोई भी चेक किया जाता है।

इसी प्रकार की समस्याएं स्प्रिंग द्वारा प्रयोग किया जाता CGLIB प्रॉक्सी के कारण होता है (जब वहाँ कोई एक वर्ग द्वारा कार्यान्वित इंटरफेस है, स्प्रिंग CGLIB प्रॉक्सी बनाता है, वर्ग किसी भी इंटरफ़ेस तो JDK प्रॉक्सी उत्पन्न होता है लागू करता है - documentation, well explained here और here)।

जैसा कि मैंने ऊपर दिए गए उत्तरों में बताया है, सेवा स्तर पर स्प्रिंग सिक्योरिटी एनोटेशन का उपयोग करना बेहतर नहीं है जो आम तौर पर इंटरफेस लागू करता है (इसलिए जेडीके प्रॉक्सी का उपयोग किया जाता है) क्योंकि इससे ऐसी समस्याएं नहीं होती हैं।

यदि आप वेब नियंत्रकों को सुरक्षित करना चाहते हैं, तो बेहतर विचार <http> और <intercept-url /> का उपयोग करना है जो नियंत्रकों में विधियों के बजाय विशिष्ट यूआरएल से बंधे हैं और बहुत अच्छी तरह से काम करते हैं। मेरे मामले में:

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

    ... 

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

</http> 
1

एंडी द्वारा प्रदान की जवाब बढ़ाएँ करने के लिए, आप का उपयोग कर सकते हैं:

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

विशिष्ट भूमिका की जांच करने के लिए।

2

एक्सएमएल कॉन्फ़िगरेशन को बदलकर इसे कैसे काम करना है इसके बारे में पहले से ही एक उत्तर है; लेकिन यदि आप यह कोड आधारित विन्यास के साथ काम कर रहे हैं, आप एक ही अपने @Configuration वर्ग पर निम्नलिखित एनोटेशन रखकर प्राप्त कर सकते हैं:

@EnableGlobalMethodSecurity(prePostEnabled=true) 
संबंधित मुद्दे