स्प्रिंग डाटा जेपीए और स्प्रिंग डाटा बाकी का उपयोग कर एक आवेदन में, मान लीजिए कि आप इस तरह एक इकाई वर्ग डालते हैं:एक स्प्रिंग डेटा आरईएसटी प्रोजेक्शन में भूमिका से अभिगम कैसे प्रतिबंधित करें?
@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
टिप्पणियों का उपयोग करने की अंतहीन उदाहरण मिल गया है ... लेकिन कैसे एक स्प्रिंग डाटा बाकी प्रक्षेपण के उपयोग को प्रतिबंधित करने का कोई उदाहरण।
सवाल से पहले कहा गया है - http://stackoverflow.com/questions/28794145/spring-data-rest-security-based-projection - मुझे लगता है कि आप जो करने का प्रयास करते हैं वह समर्थित नहीं है। इसके अलावा मैं सवाल करूँगा कि आपको यह करना चाहिए - एक प्रक्षेपण डेटा पर एक अलग दृश्य है और यहां सुरक्षा लाने से सही नहीं लगता है। मैं इसके लिए एक कस्टम नियंत्रक विधि को चलाऊंगा और इसे सुरक्षित कर दूंगा। –
@MathiasDpunkt: मान लीजिए कि आपने एक कस्टम नियंत्रक विधि लिख ली है ... 'व्यक्ति' के रिटर्न प्रकार के साथ, और '@ प्रतिक्रिया बॉडी' एनोटेशन इसे जेएसओएन को क्रमबद्ध करने के लिए लागू किया गया है। इस मामले में, 'superSecretValue' फ़ील्ड अभी भी' @ JsonIgnore' एनोटेशन के कारण छोड़ा जाएगा। तो क्या आप उस व्यक्ति पर 'व्यक्ति' इकाई को मूल रूप से समान डीटीओ कक्षा * में * '@ जेसन इग्नोर 'के बिना मैन्युअल रूप से परिवर्तित करेंगे? क्या आप अपना खुद का कस्टम जैक्सन सीरियलाइज़र लागू करेंगे, और '@ ResponseBody' पर भरोसा करने के बजाय JSON स्वयं का निर्माण करेंगे? एक और दृष्टिकोण? –
@MathiasDpunkt: ऐसा लगता है कि कुछ क्षेत्रों पर भूमिका-आधारित दृश्यता की आवश्यकता के लिए यह असामान्य उपयोग केस नहीं होना चाहिए। भंडार सीआरयूडी विधियों के लिए भूमिका-आधारित पहुंच प्रदान करना इतना आसान है, यह विचित्र है कि इकाई क्षेत्रों की भूमिका-आधारित दृश्यता प्रदान करना इतना बोझिल है। बस कम से कम प्रतिरोध के पथ को समझने की कोशिश कर रहा है। –