मैंने सफलतापूर्वक जर्सी के साथ एक आरईएसटी वेब सेवा बनाई है और इसे जावा सुरक्षा एनोटेशन के माध्यम से सुरक्षित किया है। यह इसमैं आरईएसटी संसाधनों को कैसे सुरक्षित करूं ताकि एक भूमिका का केवल एक उपयोगकर्ता इसका उपयोग कर सके?
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);
}
या आप सुरक्षा कॉन्टेक्स्ट इंजेक्ट कर सकते हैं, http: // jersey देखें। java.net/nonav/apidocs/1.11/jersey/javax/ws/rs/core/SecurityContext.html –
धन्यवाद आपकी अंतर्दृष्टि के लिए बहुत मदद मिलेगी। @Pavel भी आपको धन्यवाद, मैं अब सुरक्षा कॉन्टेक्स्ट का उपयोग कर रहा हूं अब अद्भुत दिखता है: डी – Zounadire