2011-12-18 5 views
5

मैं एक वेबपैप विकसित कर रहा हूं जो स्प्रिंग सुरक्षा को सुरक्षा परत के रूप में उपयोग करता है।लॉगिन समय और सत्र अवधि का रिकॉर्ड रखें - जावा - स्प्रिंग सुरक्षा

हमारे लिए एक महत्वपूर्ण विशेषता यह जानना है कि कौन सा उपयोगकर्ता एप्लिकेशन तक पहुंच रहा है, और कितनी बार वे खर्च कर रहे हैं।

मुझे यकीन नहीं है कि इससे कैसे निपटें। क्या कोई अन्य ढांचा है जो इस तरह के उपयोग आंकड़ों से संबंधित है?

क्या स्प्रिंग सिक्योरिटी का उपयोग करने के लिए इसका कोई तरीका है?

// मैं वसंत सुरक्षा के बारे में और अधिक पढ़ रहा हूं और ऐसा लगता है कि इसके फ़िल्टर मेरी मदद कर सकते हैं। कोई भी प्रगति यहां साझा की जाएगी।

उत्तर

5

मैं समाधान मैं का एक HttpSessionListener उपयोग कर रहा है सोच सकते हैं में से एक लगता है, तो आप एक सत्र श्रोता लागू करते हैं तो आप के रूप में समय ले सकता है और जब एक नया उपयोगकर्ता सत्र बनाया है और नष्ट हो जाता है, आप का लाभ उठाने सकता है अपने वसंत सुरक्षा संदर्भ धारक उपयोगकर्ता के प्रवेश

मैं इस

public class SesssionListenerImpl implements HttpSessionListener 
{ 
    @Override 
    public void sessionCreated(HttpSessionEvent httpSessionEvent) 
    { 
     String uniqueName =  SecurityContextHolder.getContext().getAuthentication().getName(); 
    String sessionId = httpSessionEvent.getSession().getId(); 
    long beginTimeInSeconds = System.currentTimeMillis()/1000; 
//create a record and persist to data base with sessionId, uniquename, sessionBeginTime 

} 

@Override 
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) 
{ 

    SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    httpSessionEvent.getSession().getId(); 
    long endTime = System.currentTimeMillis()/1000; 
    //load the record based on sessionId 
    //update the record with sessionEndTime 
} 
} 

जैसे कुछ बात सोच रहा हूँ की uniquename/उपयोगकर्ता आईडी पर भी नियंत्रण प्राप्त करने के लिए कहा जा रहा है कुछ नीचे पक्षों टी के लिए देखते हैं उनका दृष्टिकोण, यदि HTTP सत्र कभी भी अमान्य नहीं हो जाता है तो आप कुछ सत्रों के साथ समाप्त नहीं होंगे।

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

अद्यतन

कब्जा करने के लिए आप एक ठीक है, मुझे लगता है कि आप इसे अपने वेब.एक्सएमएल में जोड़ने के लिए वसंत एप्लिकेशन इवेंट मैकेनिज्म का उपयोग कर सकते हैं, यह श्रोता HTTP सत्र घटनाओं को प्रकाशित करता है अन्यथा आप सत्र घटनाओं तक पहुंच नहीं पाएंगे, भले ही आप एप्लिकेशन लिस्टनर

<listener> 
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
    </listener> 
लागू करें

अब एक नया वर्ग है कि ApplicationListener

@Service 
public class ApplicationSecurityListener implements ApplicationListener<ApplicationEvent> 
{ 
    @Override 
    public void onApplicationEvent(ApplicationEvent event) 
    { 

    if (event instanceof AuthorizationFailureEvent) 
    { 
     AuthorizationFailureEvent authorizationFailureEvent = (AuthorizationFailureEvent) event; 
     System.out.println ("not authorized:" + authorizationFailureEvent); 
    } 
    else if (event instanceof AuthenticationFailureBadCredentialsEvent) 
    { 
     AuthenticationFailureBadCredentialsEvent badCredentialsEvent = (AuthenticationFailureBadCredentialsEvent) event; 
     System.out.println ("badCredentials:" + badCredentialsEvent); 
    } 
      //login success event 
    else if (event instanceof AuthenticationSuccessEvent) 
    { 
     AuthenticationSuccessEvent authenticationSuccessEvent = (AuthenticationSuccessEvent) event; 
     //this will provide user id and password but no session, get source has all the user information in security context 
     System.out.println ("AuthenticationSuccessEvent:" + authenticationSuccessEvent.getSource()); 
    } 
    //this event will published if you add the HttpSessionEventPublisher to web.xml 
    else if (event instanceof SessionDestroyedEvent) 
    { 
     SessionDestroyedEvent sessinEvent = (SessionDestroyedEvent) event; 
     System.out.println ("SessionDestroyedEvent:" + sessinEvent.getId()); 
     //load session if it is not empty 
     if(sessinEvent.getSecurityContext() != null) 
     { 
      System.out.println ("SessionDestroyedEvent:" + sessinEvent.getSecurityContext().getAuthentication().getName()); 
      //update the session with endTime 
     } 
    } 
    else 
    { 
     //System.out.println ("undefined: " + event.getClass().getName()); 
    } 


} 

} 

लागू करता है एक और घटना यदि आप अपने आप में लॉगआउट पर कब्जा करना चाहते हैं, आप LogoutHandler है कि आप घटना logut तक पहुँच देता है को लागू कर सकते है जोड़ें।

+0

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

0

शायद तुम कुछ इस तरह की तलाश में हैं: अपनी साइट पर वर्तमान उपयोगकर्ताओं को ट्रैक करने

उपयोगिता, और जहाँ वे विस्तार से किया गया है। यह आपको अपनी साइट पर 'स्ट्रीम स्ट्रीम' या 'ट्रैफिक पथ' ट्रैक करने की अनुमति देता है।

http://www.quartzscheduler.org/clickstream/

+0

एचएम, सुनिश्चित नहीं है कि यह एक अच्छा विकल्प है। ऐसा लगता है कि ओपनसिम्फनी ने अपने दरवाजे बंद कर दिए हैं और इस परियोजना को बंद कर दिया गया है। –

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