2012-01-15 28 views
7

मैं एक वेब अनुप्रयोग अलग webclients (ब्राउज़र, मूल के मोबाइल एप्लिकेशन, आदि) का उपयोग कर उपयोगकर्ताओं को रजिस्टर करने के लिए अनुमति देने के लिए की जरूरत है कि है। साइन इन करने के बाद वे प्रतिबंधित सामग्री या अपनी सामग्री तक पहुंच सकते हैं (जैसे वे प्रविष्टियां बनाते हैं, आदि)।jax-रु बाकी वेब सेवा प्रमाणीकरण और प्राधिकरण

मैं अब तक क्या किया है: मैं एक jax-रु बाकी वेब सेवा (मैं glassfish पर अपने आवेदन की मेजबानी कर रहा हूँ) है कि निम्न विधियों को उजागर करता है बनाया:

  • रजिस्टर - उपयोगकर्ता पोस्ट के अपने वांछित उपयोगकर्ता नाम/पासवर्ड/ईमेल/आदि; यदि उपयोगकर्ता नाम/ईमेल अद्वितीय है, तो इस उपयोगकर्ता के लिए एक प्रविष्टि डेटाबेस में बनाई गई है (मैं दृढ़ता के लिए हाइबरनेट का उपयोग कर रहा हूं)
  • लॉगिन - उपयोगकर्ता POST का उपयोगकर्ता नाम और पासवर्ड। यदि वे ठीक हैं तो यूयूआईडी बनाया गया है और उपयोगकर्ता को लौटाया गया है (यह भविष्य के अनुरोधों के लिए टोकन के रूप में उपयोग किया जाएगा)। मेरे पास logedusers नामक एक सारणी है, उपयोगकर्ता आईडी, टोकन, वैध के रूप में कॉलम के रूप में।

यहाँ जहां यह मेरे लिए भ्रमित हो जाता है है।

चलो कहते हैं कि मैं एक और तरीका, getUserEntries, बस इतना ही उपयोगकर्ता द्वारा किए गए प्रविष्टियों लौट जाना है कि करते हैं। यह स्पष्ट करने के लिए, निम्न फ़ील्ड के साथ एक प्रविष्टि तालिका होगी: entryId, userId, text।

क्या सबसे अच्छा तरीका यहाँ है?

अब मुझे क्या करना है, मैं एक GET अनुरोध करता है और इस तरह टोकन में पारित किया गया है:

localhost:8080/myApp/getUserEntries?token=erf34c34

बाद में, यदि टोकन मान्य है, मैं logedusers मेज और आधारित userID मिल उस उपयोगकर्ता आईडी पर, सभी प्रविष्टियां प्राप्त करें और उन्हें जेसन के रूप में वापस कर दें।

कुछ इस तरह:

@GET 
@Path("getUserEntries") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getUserEntries(@QueryParam("token") String token) {  
    String userId=getUserIdFromToken(token); 
    if (userId == null){ 
     return Response.status(Response.Status.UNAUTHORIZED).build(); 
    } else { 
     //get some data associated with that userId, put it in the response object and send it back 
     return Response.ok().entity(response).build(); 
    } 
} 

हालांकि, अगर मैं और अधिक तरीकों अगर वे एक मान्य उपयोगकर्ता द्वारा कहा जाता है कि डेटा प्रदान की है क्या होता है?

मुझे हर विधि की शुरुआत में यह चेक करना होगा।

मैं इस प्राधिकरण की प्रक्रिया पारदर्शी बनाना चाहते

तो, दो प्रमुख सवाल यहाँ:

  1. इस डिजाइन ठीक है? उपयोगकर्ता/पास के साथ संपूर्ण प्रमाणीकरण, उपयोगकर्ता बनाता है और स्टोर करता है और उपयोगकर्ता को टोकन भेजता है, उपयोगकर्ता भविष्य के अनुरोधों पर टोकन भेजता है।
  2. मैं अगर मैं कई अंतिमबिंदुओं बुला उपयोगकर्ता की पहचान निर्धारित करने की आवश्यकता है क्या करते हो? मैं उन्हें कुछ एनोटेशन के साथ चिह्नित कर सकते हैं, सुरक्षा प्रदाता/प्रमाणक किसी प्रकार का उपयोग करें (इसमें मैं सत्यापित करने के लिए अपने ही तर्क जोड़ सकते हैं - जैसे यदि टोकन, दिन नहीं 5 से अधिक पुराना है आदि देखने के लिए जाँच)।

धन्यवाद

उत्तर

2

इस डिजाइन ठीक है? उपयोगकर्ता/पास के साथ संपूर्ण प्रमाणीकरण, उपयोगकर्ता बनाता है और स्टोर करता है और उपयोगकर्ता को टोकन भेजता है, उपयोगकर्ता भविष्य के अनुरोधों पर टोकन भेजता है।

यह कुछ हद तक ठीक है। वैचारिक स्तर बहुत खराब नहीं है (बशर्ते आप स्वयं पंजीकरण के साथ ठीक हो) लेकिन इंटरफ़ेस को बहुत सारे tweaking की आवश्यकता है। हालांकि, पंजीकरण और लॉगिन करने के लिए पोस्ट सही है, आपके बाकी वेबपैप के लिए आपको संदर्भ की जानकारी को संदर्भ से बाहर खींचना चाहिए यदि आपको इसकी आवश्यकता हो, और विधि स्तर पर भूमिका-आधारित पहुंच नियंत्रण का उपयोग करना चाहिए।

ध्यान दें कि आपके कंटेनर में प्रमाणीकरण और प्रमाणीकरण-समर्थन तंत्र का एक पूरा सेट है। इनका उपयोग करें।

यदि मेरे पास कॉलिंग उपयोगकर्ता की पहचान निर्धारित करने के लिए कई अंतराल हैं तो मैं क्या करूँ? मैं उन्हें कुछ एनोटेशन के साथ चिह्नित कर सकते हैं, सुरक्षा प्रदाता/प्रमाणक किसी प्रकार का उपयोग करें (इसमें मैं सत्यापित करने के लिए अपने ही तर्क जोड़ सकते हैं - जैसे यदि टोकन, दिन नहीं 5 से अधिक पुराना है आदि देखने के लिए जाँच)।

क्या वे को पहचान की आवश्यकता है? या क्या उन्हें सिर्फ यह जानने की ज़रूरत है कि उपयोगकर्ता को उन्हें एक्सेस करने की अनुमति है? यदि उत्तरार्द्ध, सबसे आसान तरीका विधि पर उपयुक्त @RolesAllowed एनोटेशन डालना है, जिस बिंदु पर (उपयुक्त कॉन्फ़िगरेशन के साथ; JEE5 security docs देखें)। यदि पूर्व में, आपको वर्तमान कार्रवाई के लिए HttpServletRequest ऑब्जेक्ट प्राप्त करने की आवश्यकता है और उपयोगकर्ता की पहचान प्राप्त करने के लिए getUserPrincipal() विधि पर कॉल करें (या शून्य अगर उन्होंने अभी तक लॉग इन नहीं किया है)। This SO question वर्णन करता है कि अनुरोध ऑब्जेक्ट प्राप्त करने के बारे में कैसे जाना है; ऐसा करने के कुछ संभावित तरीके हैं लेकिन मैं @Resource एनोटेशन के माध्यम से इंजेक्शन की सलाह देता हूं।

मैं जो नहीं करूंगा वह उपयोगकर्ताओं को आमतौर पर @QueryParam के माध्यम से अपनी पहचान प्रदान करने की अनुमति देता है; यह दुर्व्यवहार के लिए सिर्फ जंगली खुले है। आप उन्हें अन्य उपयोगकर्ताओं के बारे में पूछने की अनुमति दे सकते हैं इस तरह, लेकिन फिर आपको यह तय करने की ज़रूरत है कि क्या आप उन्हें कुछ भी बताने जा रहे हैं या नहीं, वर्तमान उपयोगकर्ता को अन्य उपयोगकर्ता के बारे में कुछ भी जानने की अनुमति है या नहीं। यह एक जटिल ऐप में जटिल जटिल समस्या है, और वर्तमान सत्यापित उपयोगकर्ता पहचान की आवश्यकता के लिए एक अच्छा बिंदु है।