I'm working on a custom Single Sign On solution and am having problems with 
JBossSecurityMgrRealm not working from within my Tomcat Valve and I can't 
figure out why. Here are the details:

I'm using JBoss AS 4.0.4GA.

I have the following code inside of a custom Tomcat Valve:


  | //Context context = request.getContext();
  | //Realm realm = context.getRealm();
  | Realm realm = this.getContainer().getRealm();
  | Principal newPrincipal = realm.authenticate(user, pass);
  | 

Both variations produce the same unexpected results (authentication always 
fails), I traced this through the JBoss code and found that the 
JBossSecurityMgrRealm class has a method getSecurityContext() which always 
returns null when called from within my valve.


  | private Context getSecurityContext()
  |    {
  |       Context securityCtx = null;
  |       // Get the JBoss security manager from the ENC context
  |       try
  |       {
  |          InitialContext iniCtx = new InitialContext();
  |          securityCtx = (Context) iniCtx.lookup("java:comp/env/security");
  |       }
  |       catch (NamingException e)
  |       {
  |          // Apparently there is no security context?
  |       }
  |       return securityCtx;
  |    }
  | 

The code in my custom Authenticator seems to work.


  | Realm realm = context.getRealm();
  | ...
  | principal = realm.authenticate(username, password);
  | 

The only difference that I have been able to find is that the context variable 
from AuthenticatorBase is set in an overridden setContainer method from 
ValveBase, here is AuthenticatorBase.setContainer:


  |     public void setContainer(Container container) {
  | 
  |         if (!(container instanceof Context))
  |             throw new IllegalArgumentException
  |                 (sm.getString("authenticator.notContext"));
  | 
  |         super.setContainer(container);
  |         this.context = (Context) container;
  | 
  |     }
  | 

When I try to mimic this behavior in my custom valve, I find that my container 
is not an instance of Context. The only other thing that I am doing is using 
the configClass attribute of the host entry in server.xml to install my custom 
authenticator.


  | <Host name="localhost" autoDeploy="false" 
  | deployOnStartup="false" deployXML="false"
  | configClass="com.acxiom.web.sso.config.ContextConfig">
  |    <Valve className="com.acxiom.web.sso.SingleSignOnValve" />
  | 


  | public class ContextConfig extends 
org.apache.catalina.startup.ContextConfig {
  | 
  |     public ContextConfig() {
  |         super();
  |         try {
  |             Map authMap = this.getAuthenticators();
  |             if (authMap.size() > 0) {
  |                 customAuthenticators = authMap;
  |             }
  |         }
  |         catch (Exception e) {
  |             //TODO Error Checking
  |         }
  |     }
  | 
  |     private Map getAuthenticators() throws Exception {
  |         Map cmap = new HashMap(); 
  |         ClassLoader tcl = Thread.currentThread().getContextClassLoader(); 
  |         Authenticator form = 
(Authenticator)tcl.loadClass("com.acxiom.web.sso.FormAuthenticator").newInstance();
 
  |         
  |         cmap.put("FORM", form);
  |         
  |         return cmap;         
  |     }
  | }
  | 

I don't want to change any of the behavior of the Realm, only the Valve and 
Authenticators. Any help figuring this out would be appreciated, sorry for the 
verbose message, but I wanted to make sure all the relevant information was 
included.

Thanks,

Josh Freeman

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

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


_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to