मैं समाधान मैं का एक 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 तक पहुँच देता है को लागू कर सकते है जोड़ें।
स्रोत
2011-12-19 15:07:12
ऐसा लगता है कि वसंत सुरक्षा फ़िल्टर जब भी उपयोगकर्ता लॉग इन और आउट हो जाता है तो मुझे पंजीकरण करने की अनुमति देता है।सुरक्षा फ़िल्टर का उपयोग कर समाधान डेटाबेस (जैसे आपने कहा) उपयोगकर्ता आईडी, लॉगिन समय और लॉगआउट समय तक जारी रहेगा! –