2015-02-18 8 views
5

मेरे पास एक उपयोगकर्ता वर्ग है और मैं एक्सेस को अधिकृत करना चाहता हूं कि केवल एक उपयोगकर्ता को यह देखने के लिए कि वह किस हकदार है।स्प्रिंग डेटा आरईएसटी प्रक्षेपण के लिए सुरक्षा को आराम दें

-

public interface UserRepository extends JPARepository<User,Integer> { 

    @PreAuthorize("hasRole('LOGGED_IN') and principal.user.id == #id") 
    User findOne(@Param("id") Integer id); 

} 

इस तरह, एक उपयोगकर्ता जब स्प्रिंग डाटा बाकी का दौरा करने जैसे URL scaffolded -

यह आसानी से जहां जेपीए भंडार में मैं नीचे किया साथ स्प्रिंग डाटा बाकी संयोजन के रूप में वसंत सुरक्षा का उपयोग कर प्राप्त था

/users/{id} 
/users/{id}/userPosts 

केवल {id} के साथ लॉग इन किए गए लोग इन्हें देख सकते हैं और बाकी सभी को 401 मिलते हैं जैसे मैं चाहता था।

मेरे समस्या यह है कि मैं अनुमान से एक है जो प्रत्येक उपयोगकर्ता के एक सार्वजनिक दृश्य है और मैं वसंत डाटा बाकी अनुमानों का उपयोग कर इसे crating हूँ के रूप में जो नीचे मैं हर {आईडी} के लिए सुलभ होने के लिए

@Projection(name = "details", types = User.class) 
public interface UserDetailsProjection { 
.. 
} 
चाहते

तो, /users/{id1}?projection=details रूप में अच्छी तरह /users/{id2}?projection=details के रूप में 200 ठीक और शो डेटा भले ही उपयोगकर्ता द्वारा {id1}

मैं @PreAuthorize ("permitAll") के साथ प्रक्षेपण चिह्नित करके इस को लागू करने के लिए शुरू किया में लॉग ऑन है, लेकिन वह काम नहीं करेगा देना चाहिए चूंकि रिपोजिटरी कठिन है सुरक्षा जांच। क्या हमारे पास यह कार्यक्षमता हो सकती है जहां प्रक्षेपण के लिए हम सुरक्षा को आराम दे सकते हैं?

मैं नवीनतम स्प्रिंग डाटा आराम और स्प्रिंग सुरक्षा वितरण

उत्तर

0

जोड़ा वसंत सुरक्षा कोड का उपयोग कर रहा डेटा का उपयोग परत में एक अच्छा विचार नहीं है। मैं आपको नियंत्रक/सेवा विधि में @PreAuthorize एनोटेशन जोड़ने का सुझाव दूंगा। चूंकि आपके पास एक क्वेरी पैरामीटर है, ?projection=details, आपके पास विवरण प्रक्षेपण के लिए अलग नियंत्रक/सेवा विधि हो सकती है।

आपके विवरण प्रक्षेपण विधि के लिए निम्न जोड़ें:

@RequestMapping("/url", params = {"projection"}) 
@PreAuthorize("hasRole('LOGGED_IN') and principal.user.id == #id") 
+2

मुझे इस दृष्टिकोण के साथ एक समस्या है कि स्प्रिंग डेटा रेस्ट के साथ सभी नियंत्रकों और सेवाओं को ढांचे द्वारा उत्पन्न किया जाता है और इसलिए मैं केवल रिपोजिटरी को संभालता हूं जहां मैं सुरक्षा कॉन्फ़िगर कर सकता हूं। मेरे पास कस्टम यूआरएल भी है और यह समाधान पूरी तरह से फिट होगा। जब तक कि मैं पूरी तरह से गलत नहीं हूं, क्या आप कृपया मुझे बता सकते हैं कि स्प्रिंग डेटा रेस्ट जेनरेट किए गए यूआरएल जैसे उपयोगकर्ता/{id} और/users/{id}/userPosts जैसे मैंने रिपोजिटरी में इन एनोटेशन को जोड़ने के बिना पोस्ट में उल्लेख किया है? – fortm

+0

मुझे भी संदेह है कि अगर मैं वसंत डेटा बाकी अनुमानों के लिए @RequestMapping जोड़ सकता हूं? – fortm

2

इस यूज-केस के लिए एक कस्टम नियंत्रक जोड़ने के लिए उचित लगता है।

कृपया यह भी विचार करें:

  • @Value टिप्पणियों का उपयोग करने के अनुमानों में पहुँच मूल्यांकन
  • एक ही डाटाबेस डेटा के लिए, लेकिन केवल पढ़ने के संचालन के लिए अलग क्षेत्र सेट, उदा किसी अन्य संस्था में जोड़ें विरासत का उपयोग (कैशिंग, आदि के साथ सावधान रहें) - अपने डेटा भंडारण प्रकार पर दो अलग-अलग संस्थाओं (प्रोफ़ाइल, खाते) में User इकाई विभाजित करने के लिए है क्योंकि वे विभिन्न पहुँच और संभवतः भी संचालन
  • तुम भी प्रोग्राम के रूप में उपयोग कर सकते मूल्यांकन करने के लिए एक ResourceProcessor<UserSummaryProjection> जोड़ सकते हैं है लगता है
  • संशोधित मॉडल निर्भर करता है

    @Projection(types = User.class, name = "summary") 
    public interface UserSummaryProjection { 
        @Value("#{@userSecurity.canReadEmail(target) ? target.email: null}") 
        String getEmail(); 
    } 
    
    : और संसाधन सामग्री (प्रक्षेपण) एक डीटीओ के साथ @Value एनोटेशन के साथ अनुमानों में

उदाहरण के के मूल्यांकन का उपयोग बदलने के

संबंधित मुद्दे