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