2012-02-23 9 views
5

मैंने सफलतापूर्वक जर्सी के साथ एक आरईएसटी वेब सेवा बनाई है और इसे जावा सुरक्षा एनोटेशन के माध्यम से सुरक्षित किया है। यह इसमैं आरईएसटी संसाधनों को कैसे सुरक्षित करूं ताकि एक भूमिका का केवल एक उपयोगकर्ता इसका उपयोग कर सके?

GET /users/  // gives me all users 
GET /users/{id} // gives the user identified by {id} 
POST /users/  // creates user 
PUT /users/{id} // updates user identified by {id} 
DELETE /users/{id} // delete user 

मैं भी सेटअप दो भूमिकाओं के साथ एक दायरे है तरह दिखता है: इतना है कि केवल व्यवस्थापक उन तक पहुँच सकते

उपयोगकर्ता और व्यवस्थापक मैं सभी तरीकों हासिल किया।

अब मैं मुक्त PUT /users/{id} और GET /users/{id} तरीकों देने के लिए, ताकि उपयोगकर्ताओं को अपने खुद और केवल अपने स्वयं के संसाधनों का उपयोग कर सकते हैं।

उदाहरण:

// user anna is logged in and uses the following methods 
    GET /users/anna // returns 200 OK 
    GET /users/pete // returns 401 UNAUTHORIZED 

के बाद से मैं एनोटेशन, मैं उपयोगकर्ता संसाधन का उपयोग करने की अनुमति दी है, तो जाँच करने के लिए इसी विधि को HTTP अनुरोध गुजर की सोच रहा हूँ के माध्यम से इस कॉन्फ़िगर करने के लिए एक तरह से नहीं मिल सका।

यह GET /users/{id} विधि के लिए कुछ इस तरह दिखेगा:

@GET 
@Path("https://stackoverflow.com/users/{id}") 
@RolesAllowed({"admin","user"}) 
@Produces(MediaType.APPLICATION_JSON) 
public Response getUser(
    @PathParam("id") String id, 
    @Context HttpServletRequest req 
) { 
    HttpSession session = request.getSession(false); 

    if (session != null && session.getValue("userID").equals(id)) 
     return getObject(User.class, id); 

    return Response.status(Status.UNAUTHORIZED).build(); 
} 

मैं इस aproach पसंद नहीं है क्योंकि मुझे लगता है कि मैं सत्र के लिए manualy userID जोड़ना होगा।

  • क्या आप इसे हल करने के लिए एक और अधिक शानदार तरीका जानते हैं?

  • यदि आप फॉर्म प्रमाणीकरण का उपयोग करते समय सत्र में उपयोगकर्ता आईडी कैसे जोड़ते हैं?

संपादित

आप विल धन्यवाद और पावेल :) यहाँ मेरी अंतिम समाधान है:

@Context 
private SecurityContext security; 

// ... 
@GET 
@Path("https://stackoverflow.com/users/{id}") 
@RolesAllowed({"admin","user"}) 
@Produces(MediaType.APPLICATION_JSON) 
public Response getUser(@PathParam("id") String id){ 
    if (security.isUserInRole("user")) 
     if (security.getUserPrincipal().getName().equals(id)) 
      return getObject(User.class, id); 
     else 
      return Response.status(Status.UNAUTHORIZED).build(); 
    else 
     return getObject(User.class, id); 
} 

उत्तर

2

HttpServletRequest में, आप लॉग इन उपयोगकर्ता की पहचान प्राप्त करने के लिए getRemoteUser() या getUserPrincipal() पर कॉल कर सकते हैं। तब आप जारी रखेंगे जैसे कि आप विशेष संसाधन तक पहुंच को विशेष रूप से अनुमति देने या इनकार करने में कर रहे हैं।

धन्य गीक स्टेटलेस लेनदेन और HTTP प्रमाणीकरण के उपयोग के संबंध में आरईएसटी के पहलू के लिए विशेष रूप से संदर्भित कर रहा है। हालांकि यह एक आरईएसटी आर्किटेक्चर के बड़े दायरे में एक महत्वपूर्ण बिंदु है, यह आपके विशिष्ट प्रश्न से कम प्रासंगिक है क्योंकि आप अपने जावा ईई ऐप के खिलाफ उपयोग किए जाने वाले प्रमाणीकरण तंत्र के प्रकार को निर्दिष्ट नहीं करते हैं, खासकर जब प्रमाणीकरण एक कंटेनर समस्या है जावा ईई में, एक आवेदन मुद्दा नहीं।

यदि आप मूल प्रमाणीकरण का उपयोग कर रहे हैं, तो आप प्रमाणीकरण और प्रमाणीकरण को प्रबंधित करने के लिए HTTP शीर्षलेख का उपयोग कर रहे हैं। यदि आप फॉर्म आधारित प्रमाणीकरण का उपयोग कर रहे हैं, तो कंटेनर सर्वलेट सत्र के माध्यम से आपके लिए यह प्रबंधन कर रहा है, सेवा को राज्य बना रहा है (क्योंकि सत्र एक राज्यव्यापी आर्टिफैक्ट हैं)।

लेकिन इसका आपके विशिष्ट प्रश्न पर कोई असर नहीं पड़ता है।

+1

या आप सुरक्षा कॉन्टेक्स्ट इंजेक्ट कर सकते हैं, http: // jersey देखें। java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –

+0

धन्यवाद आपकी अंतर्दृष्टि के लिए बहुत मदद मिलेगी। @Pavel भी आपको धन्यवाद, मैं अब सुरक्षा कॉन्टेक्स्ट का उपयोग कर रहा हूं अब अद्भुत दिखता है: डी – Zounadire

0

बाकी की तैनाती http हेडर की भूमिका को समझने है सबसे महत्वपूर्ण पहलुओं में से एक और कुकीज़।

आरईएसटी व्यावहारिक होने के लिए, आपको प्रमाणीकरण ढांचे को तैनात करने की आवश्यकता है।

GWT and Google Docs API पढ़ें।

GWT-Platform login + session management

गूगल संघबद्ध प्रवेश, OAuth और OpenID के बारे में पढ़ें।

मेरी कुछ स्पष्टीकरण पुरानी हो सकती है, अगर उन्हें OAuth 2.0 से पहले पोस्ट किया गया था।

+0

हाय गीक :) आपके उत्तर के लिए धन्यवाद। हो सकता है कि मेरे मामले में यह एक ओवरकिल है क्योंकि आरईएसटी सेवा का उपयोग केवल एक एजेक्स वेब-फ्रंटेड द्वारा किया जाता है जो आपके द्वारा लॉग इन किए जाने के बाद ही पहुंच योग्य होता है। अपने उत्तरों को पढ़कर मुझे काफी नहीं मिला कि मुझे प्रमाणीकरण फ्रेमवर्क क्यों चाहिए। हो सकता है कि आप मुझे मेरे मामले में थोड़ा और जाकर कुछ और अंतर्दृष्टि दे सकें और मुझे विश्वास दिलाने के लिए एक या दो उदाहरण बनाएं :)। हेडर और कुकी पॉइंट के बारे में मुझे कुछ स्पष्टीकरण की भी आवश्यकता हो सकती है। – Zounadire

+0

http://stackoverflow.com/questions/9425884/different-browser-means-a-different-client-from-the-same-machine/9426183#9426183 –

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

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