2015-11-11 9 views
8

स्प्रिंग डाटा जेपीए और स्प्रिंग डाटा बाकी का उपयोग कर एक आवेदन में, मान लीजिए कि आप इस तरह एक इकाई वर्ग डालते हैं:एक स्प्रिंग डेटा आरईएसटी प्रोजेक्शन में भूमिका से अभिगम कैसे प्रतिबंधित करें?

@Entity 
public class Person { 

    @Id @GeneratedValue 
    private int id; 

    private String name; 

    @JsonIgnore 
    private String superSecretValue; 

    ... 

} 

हम वसंत डाटा बाकी superSecretValue के अलावा इस इकाई के क्षेत्रों के सभी को बेनकाब करना चाहते हैं, और इसलिए हम उस क्षेत्र को @JsonIgnore के साथ एनोटेट किया गया है।

हालांकि, कुछ मामलों में हम superSecretValue पर पहुंच चाहते है, और इसलिए हम एक प्रक्षेपण कि क्षेत्रों के सभी शामिल है कि एक वापस आ जाएगी बनाएँ:

@Projection(name = "withSecret", types = {Person.class}) 
public interface PersonWithSecret { 

    String getName(); 
    String getSuperSecretValue(); 

} 

बहुत बढ़िया। तो अब हमsuperSecretValue क्षेत्र इस तरह सहित Person संस्थाओं पहुँच सकते हैं:

curl http://localhost:8080/persons?projection=withSecret 

मेरा प्रश्न है कि हम कैसे सुरक्षित कर सकते हैं कि प्रक्षेपण? कैसे हम चीजों को इस तरह है कि किसी को Person संस्थाओं superSecretValue क्षेत्र के बिना प्राप्त कर सकते हैं कॉन्फ़िगर कर सकते हैं ... लेकिन केवल एक निश्चित भूमिका (जैसे कि, ROLE_ADMIN) के साथ लोगों को छिपा क्षेत्र को पुनः प्राप्त करने प्रक्षेपण का उपयोग कर सकते हैं?

मैं वसंत डाटा जेपीए भंडार CRUD पद्धति (उदा save(), delete()) को सुरक्षित करने के @PreAuthorize या @Secured टिप्पणियों का उपयोग करने की अंतहीन उदाहरण मिल गया है ... लेकिन कैसे एक स्प्रिंग डाटा बाकी प्रक्षेपण के उपयोग को प्रतिबंधित करने का कोई उदाहरण।

+0

सवाल से पहले कहा गया है - http://stackoverflow.com/questions/28794145/spring-data-rest-security-based-projection - मुझे लगता है कि आप जो करने का प्रयास करते हैं वह समर्थित नहीं है। इसके अलावा मैं सवाल करूँगा कि आपको यह करना चाहिए - एक प्रक्षेपण डेटा पर एक अलग दृश्य है और यहां सुरक्षा लाने से सही नहीं लगता है। मैं इसके लिए एक कस्टम नियंत्रक विधि को चलाऊंगा और इसे सुरक्षित कर दूंगा। –

+0

@MathiasDpunkt: मान लीजिए कि आपने एक कस्टम नियंत्रक विधि लिख ली है ... 'व्यक्ति' के रिटर्न प्रकार के साथ, और '@ प्रतिक्रिया बॉडी' एनोटेशन इसे जेएसओएन को क्रमबद्ध करने के लिए लागू किया गया है। इस मामले में, 'superSecretValue' फ़ील्ड अभी भी' @ JsonIgnore' एनोटेशन के कारण छोड़ा जाएगा। तो क्या आप उस व्यक्ति पर 'व्यक्ति' इकाई को मूल रूप से समान डीटीओ कक्षा * में * '@ जेसन इग्नोर 'के बिना मैन्युअल रूप से परिवर्तित करेंगे? क्या आप अपना खुद का कस्टम जैक्सन सीरियलाइज़र लागू करेंगे, और '@ ResponseBody' पर भरोसा करने के बजाय JSON स्वयं का निर्माण करेंगे? एक और दृष्टिकोण? –

+2

@MathiasDpunkt: ऐसा लगता है कि कुछ क्षेत्रों पर भूमिका-आधारित दृश्यता की आवश्यकता के लिए यह असामान्य उपयोग केस नहीं होना चाहिए। भंडार सीआरयूडी विधियों के लिए भूमिका-आधारित पहुंच प्रदान करना इतना आसान है, यह विचित्र है कि इकाई क्षेत्रों की भूमिका-आधारित दृश्यता प्रदान करना इतना बोझिल है। बस कम से कम प्रतिरोध के पथ को समझने की कोशिश कर रहा है। –

उत्तर

1

आप सशर्त स्पेल अभिव्यक्तियों के साथ @Value का उपयोग करके अनुमानों में अधिभारों को अधिभारित कर सकते हैं - जैसा कि already answered similar question में है।

  1. मॉडल रिफैक्टरिंग:

    अन्य विकल्प (दूसरों के पहले ही उल्लेख किया) पर विचार करें। एक्सेस लॉजिक द्वारा विभाजन इकाई (उदा। Person < ->Account)

  2. विशेष तर्क और एक्सेस चेक के लिए कस्टम एंडपॉइंट जोड़ना। उदाहरण के लिए, वर्तमान उपयोगकर्ता "/ people/me" पर।
  3. मानक अंतराल को अनुकूलित करना। उदाहरण के लिए, "/ people", "/ people/{id}" के लिए कस्टम नियंत्रक जोड़ें जो उपयोगकर्ता प्राधिकरणों के आधार पर कस्टम Resource प्रकार (डीटीओ) प्रीप्रोसेस और वापस करेगा (उदाहरण के लिए बदले Person)। फिर आप इन प्रकारों के लिए कस्टम लिंक और कस्टम अनुमान जोड़ने के लिए कस्टम संसाधन प्रोसेसर लिख सकते हैं।

यह भी देखें: वसंत-डेटा-आराम DATAREST-428 से इस विषय पर समस्या।

0

आप इस समाधान की कोशिश कर सकते: https://stackoverflow.com/a/35399030/679240

@Projection(name = "detailed", types = User.class) 
public interface UserDetailProjection extends UserSimpleProjection{ 

    @Value("#{@userService.checkAccess(target)? target.email : null}") 
    public String getEmail(); 
} 
संबंधित मुद्दे