I've just noticed a problem that seems to be in both 4.0.4 CR2 and RC1 where 
the subjectContext stack keeps growing from invocation to invocation on 
individual threads. A side effect of this problem is that it is possible for a 
thread to stay authenticated from one client call to the next. I can reproduce 
this side effect in my main application although have not been able to do so in 
a simple test case.

I've tracked it to the org.jboss.aspects.security.AuthenticationInterceptor 
invoke method (shown below). You'll notice in the finally block it sets the 
principal and credential to null. What this does is add a null entry to the 
stack when I think what is intended is to clear the stack. The end result is on 
each invocation chain, a new 'null' entry is added to the stack that is never 
removed and it grows and grows. This can be compounded if the application code 
logs in users that are never logged out. They never get removed from the stack 
either.

I don't really know how to fix this as I don't really understand the flow of 
the invocation.metaData and the code in general to find a point to do this 
without unintentionally screwing up something else. Ideally, when the server 
knows a thread is finished, it should clear the stack, however you don't want 
to do this too early at a point when the app thinks it should still be logged 
in. 

I tried replacing the setPrincipal and setCredential in the finally block with 
SecurityAssociation.clear() and this helped but not in all circumstances since 
that block of code may not be executed. I have found a case where the 
metadata.security.principal turns up null in the finally block: if a client is 
not logged in and calls a 'PermitAll' method in the server, which then goes on 
internally to log in a user but not log it out, the code is not executed and 
the SecurityAssociation doesn't get cleared.

On the flip side, you don't want this called all the time or it will clear the 
stack when it shouldn't be cleared causing potential insufficient permissions 
errors.


  | 
  |    /**
  |     * Authenticates the caller using the principal and credentials in the
  |     * Infocation if thre is a security manager and an invcocation method.
  |     */
  |    public Object invoke(org.jboss.aop.joinpoint.Invocation invocation) 
throws Throwable
  |    {
  |       try
  |       {
  |          authenticate(invocation);
  |       }
  |       catch (GeneralSecurityException gse)
  |       {
  |          handleGeneralSecurityException(gse);
  |       }
  | 
  |       Object oldDomain = SecurityContext.currentDomain.get();
  |       try
  |       {
  |          SecurityContext.currentDomain.set(authenticationManager);
  |          return invocation.invokeNext();
  |       }
  |       finally
  |       {
  |          SecurityContext.currentDomain.set(oldDomain);
  |          // so that the principal doesn't keep being associated with thread 
if the thread is pooled
  |          SecurityAssociation.popSubjectContext();
  | 
  |          if (invocation.getMetaData("security", "principal") != null)
  |          {
  |             SecurityAssociation.setPrincipal(null);
  |             SecurityAssociation.setCredential(null);
  |          }
  |       }
  |    }

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3940716#3940716

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3940716


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to