2009-12-19 12 views
14

मैं एक ऐसे एप्लिकेशन को विकसित कर रहा हूं जिसे एक ही उपयोगकर्ता नाम और पासवर्ड का उपयोग करके एकाधिक लॉगिन को रोकने की आवश्यकता है।एक ही उपयोगकर्ता नाम और पासवर्ड का उपयोग कर एकाधिक लॉगिन को रोकें

यदि यह उसी मशीन पर होता है तो स्पष्ट रूप से हमें उपयोगकर्ता सत्र के साथ कुछ करने की आवश्यकता होती है, लेकिन अगर वे एक ही उपयोगकर्ता नाम और पासवर्ड का उपयोग कर विभिन्न मशीनों पर लॉगिन कर रहे हैं तो इसे भी रोकना चाहिए।

हम निम्न बातों का ध्यान रखना है: उपयोगकर्ता लॉगआउट बिना ब्राउज़र बंद करने

  1. हैं।
  2. यदि सत्र का समय समाप्त हो गया है।

मैं इस पर किसी भी मदद की सराहना करता हूं।

+1

आपकी मदद करता है कि आप उपयोगकर्ता/सत्र डेटा पर नज़र रखने के लिए प्रयोग कर रहे हैं केंद्रीय भंडारण प्रणाली के कुछ प्रकार है? यदि ऐसा है, तो ये क्या है। – GrayWizardx

+0

क्या आप स्प्रिंग सुरक्षा ढांचे का उपयोग कर रहे हैं? या आपने अपना खुद का कार्यान्वित किया है। क्या यह सवाल बंद है? – Ameya

उत्तर

3

कॉलम नाम के साथ तालिका में एक अतिरिक्त फ़ील्ड लें, "IsLoggedIn" को बिट फ़ील्ड के रूप में कहें और उपयोगकर्ता को लॉग इन होने तक इसे सही पर सेट करें। जैसे ही उपयोगकर्ता लॉग आउट इसे गलत पर सेट करता है। सत्र समाप्ति समय के लिए भी यह करने की आवश्यकता है। जैसे ही सत्र समाप्त हो के रूप में इस क्षेत्र को झूठी चलाता स्वचालित रूप से उपयोग करने के लिए या सपा कॉल के माध्यम से स्थापित किया जाना चाहिए

अच्छा समाधान अब भी है का स्वागत करते हैं

+0

श्री शांतनु गुप्ता, ऐसा प्रतीत होता है। लेकिन लागू होने से पहले मैं जानना चाहता हूं कि एक ऐसा कार्यक्रम कैसे प्राप्त किया जाए जो उस सत्र की अवधि समाप्त हो जाए। सहायता। सर्वर कॉन्फ़िगरेशन के तहत – vivmal

+1

आपको सत्र समाप्ति समय सेट करने की आवश्यकता है, जैसे ही आपके सत्र xpires जो डेटाबेस के अंतर्गत संग्रहीत हैं, आप IsLoggedIn वैरिएबल को गलत और रीसेट सत्र फ़ील्ड सेट कर सकते हैं। वेब अनुप्रयोगों के लिए आपको आमतौर पर IsLoggedIn फ़ील्ड की आवश्यकता नहीं होती है क्योंकि आपका सत्र फ़ील्ड स्वयं दर्शाता है कि यदि सत्र फ़ील्ड शून्य नहीं है तो उपयोगकर्ता पहले ही लॉग इन है लेकिन विंडो एप्लिकेशन के तहत सत्र की कोई अवधारणा नहीं है, इसलिए उस मामले में आप ऊपर उपयोग कर सकते हैं उल्लिखित विधि। –

+0

सत्र चर का उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए लिंक के माध्यम से जाएं। http://techpint.com/programming/how-create-session-variable-aspnet –

0

मैं प्रत्येक उपयोगकर्ता के अंतिम ज्ञात आईपी पते और जब के लिए एक टाइमस्टैम्प से ट्रैक करना चाहते वे उस आईपी पर आखिरी थे। फिर आप अन्य आईपी से 5 मिनट, एक घंटा, या जो कुछ भी आपको पसंद कर सकते हैं उसे एक्सेस कर सकते हैं।

जब भी आईपी पता स्विच हो जाता है, तो आप ए) उपयोगकर्ता के पुराने सत्र की अवधि समाप्त कर सकते हैं, इसलिए उन्हें वापस लॉग इन करने के लिए मजबूर होना पड़ता है और बी) प्रति उपयोगकर्ता काउंटर में वृद्धि (जिसे आप हर घंटे शून्य कर सकते हैं)। यदि काउंटर 5 (या कुछ) से ऊपर चला जाता है, तो आप लंबे समय तक उपयोगकर्ता के खाते में सभी पहुंच को अवरुद्ध कर सकते हैं।

+3

एनएटी और गतिशील आईपी आवंटन के कारण, आईपी जोड़ों पर निर्भर कोई भी समाधान समस्याएं पैदा करेगा और मैं इसके खिलाफ सलाह दूंगा। –

+0

यदि आपका सामान्य उपयोगकर्ता का आईपी एक घंटे में 5 बार बदलता है, तो हां। कुछ और के लिए जाओ। – ojrac

0

लॉग इन करते समय आप उपयोगकर्ता के लिए कुछ प्रकार के सत्र-आईडी स्टोर कर सकते हैं। जब उपयोगकर्ता लॉग आउट करता है या सत्र समाप्त होने पर, आप उस जानकारी को फिर से हटा देते हैं।

जब कोई उपयोगकर्ता लॉग इन करने का प्रयास करता है, और आपके पास पहले से ही इस उपयोगकर्ता के लिए संग्रहीत सत्र-आईडी है, तो उपयोगकर्ता को इसकी पुष्टि करने दें, और फिर पुराने सत्र को अमान्य कर दें।

यदि ब्राउज़र क्रैश हो जाता है या ऐसा कुछ ऐसा होता है तो उपयोगकर्ता निश्चित रूप से फिर से लॉगिन करना चाहता है, इसलिए उपयोगकर्ता को सत्र समाप्त होने की प्रतीक्षा करने से परेशान होना मुश्किल हो सकता है।

क्या यह आपके आवेदन के लिए समझ में आता है?

+0

श्री पीटर लैंग, मेरा मानना ​​है कि सत्र-आईडी केवल क्लाइंट साइड/ब्राउज़र अंत में ही बनाए रखा जा सकता है। क्या होगा यदि दो उपयोगकर्ता एक ही लॉगिन विवरण साझा कर रहे हों लेकिन विभिन्न मशीनों पर बैठे हों? सहायता। – vivmal

+0

क्या आप लॉगिन पर सर्वर पर सत्र-आईडी असाइन नहीं कर सकते हैं? दो लॉगिन उपयोगकर्ताओं को एक ही लॉगिन विवरण साझा करने का कारण क्या है? –

+0

हम डेटाबेस तालिका में एक अतिरिक्त फ़ील्ड (लॉग इनइन) ले सकते हैं और जब कोई लॉगिन या लॉगआउट करता है तो इसे सही या गलत बनाते हैं। कुछ उपयोगकर्ता लॉग इन करते समय हम सर्वर पर सत्र-आईडी कैसे असाइन कर सकते हैं। कृपया मुझे अवगत कराएं। अग्रिम में धन्यवाद। – vivmal

2

मैं शानानु गुप्ता के समाधान की भी सलाह दूंगा - एक डेटाबेस कॉलम है जो दर्शाता है कि उपयोगकर्ता वर्तमान में लॉग इन है, और उस कॉलम को तदनुसार अपडेट करें।

'कब्जा' सत्र की समाप्ति के लिए, यदि आप अपने web.xml में परिभाषित करने की जरूरत:

<listener> 
    <listener-class>com.foo.MySessionListener</listener-class> 
</listener> 

कहाँ MySessionListenerHttpSessionListener इंटरफेस (एपीआई सर्वलेट द्वारा प्रदान की) के अपने कार्यान्वयन है।

23

यदि उपयोगकर्ता लॉगआउट के बिना ब्राउज़र को बंद करता है।

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

सबसे आसान तरीका User एक static Map<User, HttpSession> चर राशि है और यह HttpSessionBindingListener (और Object#equals() और Object#hashCode()) को लागू करने देने के लिए है।

public class User implements HttpSessionBindingListener { 

    // All logins. 
    private static Map<User, HttpSession> logins = new HashMap<User, HttpSession>(); 

    // Normal properties. 
    private Long id; 
    private String username; 
    // Etc.. Of course with public getters+setters. 

    @Override 
    public boolean equals(Object other) { 
     return (other instanceof User) && (id != null) ? id.equals(((User) other).id) : (other == this); 
    } 

    @Override 
    public int hashCode() { 
     return (id != null) ? (this.getClass().hashCode() + id.hashCode()) : super.hashCode(); 
    } 

    @Override 
    public void valueBound(HttpSessionBindingEvent event) { 
     HttpSession session = logins.remove(this); 
     if (session != null) { 
      session.invalidate(); 
     } 
     logins.put(this, event.getSession()); 
    } 

    @Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
     logins.remove(this); 
    } 

} 

आप User के लिए लॉग इन जब इस प्रकार है:

User user = userDAO.find(username, password); 
if (user != null) { 
    request.getSession.setAttribute("user", user); 
} else { 
    // Show error. 
} 

तो यह valueBound() जो किसी भी पहले से logins नक्शे से उपयोगकर्ता में लॉग इन निकाल देंगे आह्वान और सत्र रद्द करना होगा।

आप User लॉगआउट जब इस प्रकार है:

request.getSession().removeAttribute("user"); 

या जब सत्र का समय समाप्त है, तो valueUnbound() जो logins नक्शे से उपयोगकर्ता को हटा सक्रिय किया जाएगा।

+1

+1 imho, यह सबसे कठिन उपयोग केस है। पिछले उपयोगकर्ता को लॉग आउट करने के लिए समझ में आता है, अन्यथा आपको फिर से लॉग इन करने से पहले सत्र के समय तक इंतजार करना होगा। – aldrin

+0

मैं सहमत हूं - कई उपयोगकर्ता लॉगआउट बटन पर क्लिक करने के बजाए एक टैब/विंडो बंद कर देंगे, और सत्र से समय के लिए प्रतीक्षा करना वास्तव में परेशान होगा। – tofarr

+0

मैं इसे पढ़ रहा हूं और मैं उपयोगकर्ताओं के मानचित्र के बारे में उलझन में हूं। क्या यूजर क्लास एप्लीकेशनस्कोप्ड है? साथ ही HttpRequest के एक उदाहरण का अनुरोध है? –

2

मैं बस आपके लिए इन सभी विवरणों को संभालने के लिए सुरक्षा ढांचे का उपयोग करने का सुझाव दूंगा। उदाहरण के लिए, Spring Security, मौजूदा प्रोजेक्ट में एकीकृत करने के लिए काफी आसान है, यदि आवश्यक हो तो बहुत अधिक अनुकूलित किया जा सकता है - और सबसे महत्वपूर्ण बात यह है कि इसमें समवर्ती लॉगिन का पता लगाने और नियंत्रित करने के लिए अंतर्निहित समर्थन है।

पहिया को फिर से शुरू न करें जब इसकी आवश्यकता नहीं होती है, अन्यथा आप एक बेवकूफ पहिया बनाने के लिए थोड़ा सा समय व्यतीत करेंगे।

0

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

आपके द्वारा उल्लिखित समस्या को हल करने के लिए। आपके पास 2 विकल्प हैं,

  1. बहुत कम सत्र टाइमआउट (5 मिनट की तरह) है और प्रत्येक उपयोग पर सत्र बढ़ाएं। इस तरह, लॉग आउट किए बिना छोड़कर उपयोगकर्ता स्वचालित रूप से लॉग आउट हो जाएगा।

  2. अन्य सत्र टक्कर। नया सत्र पुराने सत्र को टक्कर देता है। बंपेड सत्र 24 घंटे के लिए विशेष झंडा के साथ डीबी में रहता है। हम उपयोगकर्ता को बताने के लिए एक संदेश प्रदर्शित करते हैं कि दूसरा सत्र बंप किया गया है और समय और आईपी प्रदर्शित करता है। इस तरह, उपयोगकर्ता को सूचित किया जाएगा कि उनके खाते से समझौता किया जा रहा है या नहीं।

4

अपने डेटाबेस — में एक तालिका बनाने के लिए यह [online_users] — तीन क्षेत्रों के साथ संपर्क कर सकें:

[online_users] 
1. username 
2. login_time 
3. logout_time 

जब भी में, उपयोगकर्ता के नाम सम्मिलित किसी उपयोगकर्ता के लॉग और [online_users] में प्रवेश करते समय।

उन सभी पृष्ठों पर जिन्हें उपयोगकर्ताओं को लॉग इन करने की आवश्यकता है, इस स्थिति को रखें: उपयोगकर्ता का logout_time खाली है या नहीं, यह देखने के लिए [online_users] देखें।

जब भी कोई उपयोगकर्ता लॉगआउट बटन दबाता है, तो उस उपयोगकर्ता के नाम के लिए में logout_time सेट करें।

किसी एक सक्रिय उपयोगकर्ता नाम और पासवर्ड से लॉग इन करने का प्रयास करता है, username और logout_time के लिए जाँच करें और यह संदेश मिलता है कि उपयोगकर्ता पहले से ही में। लॉग होता है और, सबसे महत्वपूर्ण बात, यह है कि उपयोगकर्ता के लिए MULTIPLELOGIN को logout_time सेट प्रदर्शित करते हैं।

यदि वह उपयोगकर्ता किसी अन्य मशीन पर लॉग इन है, तो यदि वह किसी अन्य पृष्ठ पर रीफ्रेश या नेविगेट करता है तो साइट उसे बताएगी कि उसे लॉग आउट कर दिया गया है। फिर, उपयोगकर्ता को साइट के मुखपृष्ठ पर रीडायरेक्ट किया जा सकता है।

0

मैं loginFilter मैं उपयोग में खुद के लिए एक संभव समाधान,

लागू कर दिया है, मैं अपने सिस्टम पर उपयोगकर्ता रिकॉर्ड के भीतर एक lastloggedin, userloggedin और userSession निर्धारित किया है।

  user.setUser_lastlogged(new Date()); 
      user.setUser_loggedin(true); 
      user.setSessionId(request.getSession().getId()); 
      appService.saveUsers(user); 

तो मैं तैयार विधि में कोड का एक टुकड़ा है, जब मैं अपने struts2 कार्यों के किसी भी करने के लिए जाना।

@Override 
public void prepare() throws Exception { 
    UsersBase usercheck = appservice.getUserByUsername((String)request.getSession().getAttribute("j_username")); 
    if(request.getSession().getId().equals(usercheck.getSessionId())){ 
     request.getSession().invalidate(); 
    } 

} 

यह एक और मशीन पर बाहर उपयोगकर्ता प्रवेश करेंगे जब वे के लिए लॉग इन करें, या यदि आप उन्हें प्रवेश करने के लिए नहीं करना चाहते हैं मैं loginFilter

UsersBase userdto = appService.getUserByUsername(username); 
     if (userdto != null) { 
      if ((userdto.getUser_loggedin())) { 
       if (request.getSession().getId().equals(userdto.getSessionId())) { 
        authRequest.eraseCredentials(); 
        request.getSession().setAttribute("error", "You are already logged in "); 
       } 
      } 
     } 
2

हो सकता है कि बहुत ज्यादा सरल पर निम्न कर सकता है, लेकिन हे ... यह मेरे लिए Web2Py में काम करता है:

केवल सफल लॉगिन पर, मैं auth_membership तालिका में सत्र आईडी (respond.session_id) लिख रहा हूं। लैंडिंग पृष्ठ पर (इंडेक्स पेज) मैं जांचता हूं कि वर्तमान प्रतिक्रिया.session_id डीबी से आने वाले सत्र आईडी के बराबर है या नहीं। यदि हां - तो सब ठीक है। यदि नहीं - ("पुराना", पहला) उपयोगकर्ता विनम्रता से लॉग आउट है।

प्रत्येक लॉगिन के साथ उपर्युक्त काम एक नई प्रतिक्रिया.session_id डीबी में बनाया और संग्रहीत किया जाता है। चेकिंग केवल लैंडिंग पृष्ठ पर की जाती है (जो कि मेरे ऐप में सबसे महत्वपूर्ण है, कई अन्य कार्यों को शुरू करना), इसलिए ऊपर के लिए बहुत से डीबी हिट नहीं हैं। उपर्युक्त उपयोगकर्ता लॉगिंग पर निर्भर नहीं है। कोई आईपी पता शामिल नहीं है (जो अन्य ने उल्लेख किया है, अपने मुद्दों से पीड़ित है) यह एक समय में केवल एक उपयोगकर्ता को लॉग इन करने की अनुमति देता है और यह "पुराने" उपयोगकर्ता को लॉग आउट करता है।

आशा है कि यह NeoToren

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

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