8

मैं जब मेरे GAE (गूगल एप इंजन) आवेदन के कुछ हिस्सों तक पहुँचने एक लॉगिन/पासवर्ड उपयोग करने के लिए उपयोगकर्ता की आवश्यकता करना चाहते हैं। मैं पूर्वनिर्धारित उपयोगकर्ताओं के सेट तक पहुंच को सीमित करना चाहता हूं, उदा। पृष्ठ पर, जहां डेटास्टोर में नया डेटा अपलोड किया जा सकता है।प्रमाणीकरण

मैंने पाया वहाँ यह कैसे हल किया जा सकता GAE पर 3 तरीके हैं, लेकिन यह केवल पिछले एक (सबसे जटिल) की तरह दिखता है मेरी समस्या के लिए एक समाधान हो सकता है:

  1. एक तैनाती वर्णनकर्ता का उपयोग करें (<security-constraint> web.xml में)। यह अच्छा नहीं है, क्योंकि उन उपयोगकर्ताओं के पास GAE एप्लिकेशन के व्यवस्थापक पृष्ठ पर दर्शक हैं, जहां वे बिलिंग इतिहास देख सकते हैं, डेटास्टोर, लॉग इत्यादि ब्राउज़ कर सकते हैं और यह कुछ है जो मुझे टालना है।

  2. फ़ेडरेटेड प्रवेश (ओपन आईडी) (https://developers.google.com/appengine/articles/openid) का प्रयोग करें और उपयोगकर्ताओं को अपने Google, याहू उपयोग करने की अनुमति या लॉगिन करने के लिए अन्य पहचान। यह कोई समाधान नहीं है, क्योंकि मैं उपयोगकर्ताओं के एक छोटे से सेट (अधिकतम 5) तक पहुंच सीमित करना चाहता हूं और सभी को एप्लिकेशन का उपयोग करने की अनुमति नहीं देना चाहता हूं।

  3. अन्य विकल्प केवल HTTPS के माध्यम से सरल कस्टम प्रवेश पृष्ठ सुलभ बना सकते हैं और उपयोगकर्ता एक पोस्ट अनुरोध में उपयोगकर्ता नाम & पासवर्ड भेज देना है एक करने के लिए (यह सादे के बाद से हम सुरक्षित https कनेक्शन है हो सकता है) सर्वलेट पर सर्वलेट, कुछ वैधता के साथ कुछ सत्र पहचानकर्ता उत्पन्न करता है और इसे प्रत्येक बाद के अनुरोध का हिस्सा बना देता है। यदि सत्र पहचानकर्ता मौजूद होता है और मैन्युअल रूप से समाप्त नहीं होता है तो उपयोगकर्ता को प्रत्येक बार एक GET या POST अनुरोध भेजना पड़ता है।

व्यवस्थापक खातों को बनाए रखने के तरीके पर कोई अन्य/बेहतर प्रस्ताव? क्या HttpSession अंतिम संस्करण के साथ मदद कर सकता है?

सधन्यवाद, स्टेन

+1

आप यहां दो पूरी तरह से अलग मुद्दों, प्रमाणीकरण और प्रमाणीकरण को भंग कर रहे हैं। प्राधिकरण की जांच के लिए आप अपने स्वयं के समाधान के साथ पहले दो समाधान (प्रमाणीकरण) को जोड़ सकते हैं। ऐसा करने का सबसे आसान तरीका डेटास्टोर में अनुमत उपयोगकर्ताओं की एक सूची बनाएगा, और जब वे पीटर और एडम नीचे सुझाव देते हैं, तो अनुमतियों की जांच के लिए लॉग इन करते समय उपयोगकर्ताओं को देखें। –

उत्तर

1

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

सभी उपयोगकर्ताओं को लॉगिन करने की अनुमति देने से वास्तव में उन्हें मेरे ऐप में कोई पहुंच नहीं मिलती है - वे व्यवस्थापक पृष्ठ देखते हैं लेकिन वे एक संदेश से अलग हैं, "आपको इनमें से किसी भी प्रशासनिक विकल्प तक पहुंच नहीं है"।

+0

क्या कोई भी सर्वलेट पक्ष पर इसके लिए कुछ नमूना कोड साझा कर सकता है? – Axwack

1

कुछ नोट:

  1. अपने धारणा AFAIK सही नहीं है। एप्लिकेशन में लॉग इन करने के लिए व्यवस्थापक पृष्ठों की अनुमति के साथ कुछ लेना देना नहीं है। व्यवस्थापक पृष्ठों तक पहुंच रखने के लिए आपको "अनुमतियां" पृष्ठ के माध्यम से उपयोगकर्ताओं को स्पष्ट रूप से जोड़ना होगा।

  2. उपयोगकर्ता ओपनआईडी के साथ उपयोगकर्ता लॉग इन करने के बाद भी आप उपयोगकर्ता गुण (ईमेल) की जांच कर सकते हैं और उन्हें एक्सेस से इनकार कर सकते हैं।

  3. यह निश्चित रूप से करने योग्य है। उपयोगकर्ताओं को ट्रैक करने का प्राकृतिक तरीका sessions है। उदाहरण के लिए Google।

दोनों ही मामलों 2. '3. यह (वापसी 404) है कि सत्र की जाँच करता है अगर वहाँ उपयोगकर्ता के प्रवेश एक सर्वलेट फिल्टर उपयोग कर सकते है और अस्वीकार करने के लिए करता है, तो उपयोगकर्ता प्रवेश न होने पर सलाह दी जाती है में

1

मैं मानक Google लॉगिन पेज का सुझाव दें। आप प्रमाणीकरण नियंत्रक (जावा + जर्सी फ्रेमवर्क निश्चित रूप से आवश्यक नहीं है जो) में कुछ इस तरह का उपयोग करें:

@Path("/login") 
public Response login(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI(userService.createLoginURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

@GET 
@Path("/logout") 
public Response logout(@Context UriInfo ui) throws Exception { 
    UserService userService = UserServiceFactory.getUserService(); 
    com.google.appengine.api.users.User user = userService.getCurrentUser(); 
    Response response; 
    if (user == null) { 
    URI uri = new URI("/"); 
    response = Response.seeOther(uri).build(); 
    } else { 
    URI uri = new URI(userService.createLogoutURL(ui.getBaseUri().toString())); 
    response = Response.seeOther(uri).build(); 
    } 
    return response; 
} 

प्रवेश पद्धति Google प्रवेश पृष्ठ करने के लिए एप्लिकेशन रीडायरेक्ट करता है, तो उपयोगकर्ता missin है (अनिवार्य रूप से लॉग इन नहीं) । लॉगआउट विधि उपयोगकर्ता को लॉगआउट करेगा।

आशा इस 3 समाधान के लिए

0

वेतन ध्यान में मदद करता है: बजाय उपयोगकर्ता नाम & पासवर्ड गुजर मेरी webapp पूछता उपयोगकर्ता नाम & apiSecret (प्रथम प्रवेश के पर बना) की है, तो आप को अमान्य कर सकते हैं (और दोबारा बनाने के) जल्दी से अगर कुछ गलत हो जाता है तो apiSecret।

एक और विकल्प है: OAuth (https://developers.google.com/appengine/docs/java/oauth/)। यहां मेरा कोड का टुकड़ा है (UserAccount उपयोगकर्ता का प्रतिनिधित्व करने के लिए मेरी कक्षा है; उपयोगकर्ता "com.google.appengine.api.users.User" है, पुनर्प्राप्ति उपयोगकर्ता (..) एक लॉग इन "उपयोगकर्ता से मेरे उपयोगकर्ता खाते को पुनर्प्राप्त करने के लिए फ़ंक्शन है "):

public UserAccount getUserLogged(HttpServletRequest request) { 
    try { 
     User loggedUser = oauthService.getCurrentUser(); 
     if(loggedUser!=null) { 
      return super.userAB.retrieveUser(loggedUser); 
     } 
    } catch (OAuthRequestException e) { 
     return null; 
    } 
    return null; 
} 
संबंधित मुद्दे