SecurityFilter doing authentcation upon logout?

Matthew Hixson <[email protected]> Tue, 5 May 2009 15:51:30 -0700
Newsgroups gmane.comp.java.securityfilter.user
Message-ID <[email protected]>
We have a method that updates the database with the last time that a  
user logs in.  I put a Thread.dumpStack() call in my method,  
updateLastLogin().  The problem I have is that upon logout execution  
ends up passing through this method again which, of course, has the  
result of logging to the database the time that the user logged out.

My Realm, SARealm, extends SecurityFilter's TrivialCatalinaRealm.

While logging in the stack trace looks like this.

java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1176)
	at  
mycompany 
.SpecialAuthenticator.updateLastLogin(SpecialAuthenticator.java:36)
	at com.mycompany.authentication.SARealm.authenticate(SARealm.java:140)
	at  
org 
.securityfilter 
.realm 
.catalina.CatalinaRealmAdapter.authenticate(CatalinaRealmAdapter.java: 
95)
	at  
org 
.securityfilter 
.authenticator.FormAuthenticator.processLogin(FormAuthenticator.java: 
297)
	at  
org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java: 
144)
	at  
org 
.apache 
.catalina 
.core 
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 
235)
	at  
org 
.apache 
.catalina 
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at  
org 
.apache 
.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 
233)
	at  
org 
.apache 
.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 
191)
	at  
org 
.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 
128)
	at  
org 
.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 
102)
	at  
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 
568)
	at  
org 
.apache 
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at  
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 
286)
	at  
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 
845)
	at org.apache.coyote.http11.Http11Protocol 
$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java: 
447)
	at java.lang.Thread.run(Thread.java:613)

While logging out it produces this:

java.lang.Exception: Stack trace
	at java.lang.Thread.dumpStack(Thread.java:1176)
	at  
mycompany 
.SpecialAuthenticator.updateLastLogin(SpecialAuthenticator.java:36)
	at com.mycompany.authentication.SARealm.authenticate(SARealm.java:140)
	at  
org 
.securityfilter 
.realm 
.catalina.CatalinaRealmAdapter.authenticate(CatalinaRealmAdapter.java: 
95)
	at  
org 
.securityfilter 
.authenticator.FormAuthenticator.processLogin(FormAuthenticator.java: 
284)
	at  
org.securityfilter.filter.SecurityFilter.doFilter(SecurityFilter.java: 
144)
	at  
org 
.apache 
.catalina 
.core 
.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 
235)
	at  
org 
.apache 
.catalina 
.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at  
org 
.apache 
.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 
233)
	at  
org 
.apache 
.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 
191)
	at  
org 
.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 
128)
	at  
org 
.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 
102)
	at  
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java: 
568)
	at  
org 
.apache 
.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at  
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 
286)
	at  
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 
845)
	at org.apache.coyote.http11.Http11Protocol 
$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java: 
447)
	at java.lang.Thread.run(Thread.java:613)

So, why does  
org.securityfilter.authenticator.FormAuthenticator.processLogin() end  
up getting called when the user is logging out?  My relevant part of  
securityfilter-config.xml looks like:

<login-config>
     <auth-method>FORM</auth-method>
     <form-login-config>
       <form-login-page>/login.jsp</form-login-page>
       <form-error-page>/login.jsp?err=1</form-error-page>
       <form-default-page>/members/index.jsp</form-default-page>
       <form-logout-page>/logout.jsp</form-logout-page>
       <!-- remember-me config -->
          <remember-me  
className 
= 
"org 
.securityfilter.authenticator.persistent.DefaultPersistentLoginManager">
             <!-- optional settings for default persistent login  
manager -->
             <remember-me-param name="cookieLife" value="1"/><!--  
number of days -->
             <remember-me-param name="protection" value="all"/><!--  
all, none, validation, encryption -->
             <remember-me-param name="useIP" value="false"/>
             <remember-me-param name="encryptionAlgorithm" value="DES"/>
             <remember-me-param name="encryptionMode" value="ECB"/>
             <remember-me-param name="encryptionPadding"  
value="PKCS5Padding"/>
             <!-- encryption keys; customize for each application -->
             <!-- NOTE: these kys must be specified AFTER other  
encryption settings -->
             <remember-me-param name="validationKey" value="<my key>"/>
             <remember-me-param name="encryptionKey" value="<my other  
key>"/>
          </remember-me>
     </form-login-config>
   </login-config>

I put some debug code into my /logout.jsp to see if that were somehow  
triggering something, but the stack trace happens before execution  
even enters logout.jsp.
   Any thoughts on how I can prevent my Realm's authenticate() method  
being called upon logout?  And am I incorrect in assuming that  
authenticate() should only be called upon initial login?
   Thanks for any feedback,
    -M@

------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com