Hi
I have a J2EE application that runs on JBoss 4.0.3. The application consists of
a web front-end and a EJB 2.1 Stateless Session Bean to implement our business
logic.
Users are authenticated by logging into the web interface. A JAAS LoginModule
is used to create a security realm for our web tier (configured in our web.xml
& jboss-web.xml files). When a business method is invoked on the SSB the users
credentials are correctly propagated to the EJB container (the same security
realm has been configured in our jboss.xml file).
At this stage declarative security (to apply role permissions to EJB methods in
ejb-jar.xml) and programmatic security (to access users principal & role using
the interface methods SessionContext.getCallerPrincipal().getName() &
SessionContext.isCallerInRole("Admin") respectively) work correctly.
The problem arises when an EJB makes a remote call to another remote EJB on
another host with a different username/password . After successfully returning
from this remote call our original SSB appears to have an incorrect
SesssionContext.
The remote lookup and operation to the second EJB is done using the following
function:
void changeRemoteBlah(){
// At this point the SessionContext for the current user on the current
local ejb is ok, and we can call local authorized methods
Properties env = new Properties();
env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jboss.security.jndi.JndiLoginInitialContextFactory");
env.setProperty(Context.SECURITY_PRINCIPAL, "remoteAdmin");
env.setProperty(Context.SECURITY_CREDENTIALS, password);
InitialContext ctx = new InitialContext(env);
Object o = ctx.lookup(jndiRemote);
BlahManagerRemoteHome home = (BlahManagerRemoteHome)
PortableRemoteObject.narrow(o, BlahManagerRemoteHome.class);
BlahManagerRemote manager = home.create();
manager.deployBlah();
return;
// after the return the SessionContext for the caller EJB is wrong, and we can
no longer call our own (local) ejb methods that have authorization on them
}
Debug logs after the remote call, upon returning to the 1st EJB:
org.jboss.security.SecurityAssociation.getSubject,[EMAIL
PROTECTED],subject=null}
org.jboss.security.SecurityAssociation.getPrincipal, cache info: [EMAIL
PROTECTED](27545610)[EMAIL PROTECTED](Admin)[EMAIL
PROTECTED](Roles(members:Admin)),[EMAIL PROTECTED],expirationTime=1165984451664
The getPrincipal call shows the correct original user, however the getSubject
call shows the user that was used for the remote call. Does anyone know why
this is the case and how to fix it?
Alternatviely as a workaround solution we have considered storing a local copy
of the Users details (SessionContext.getUserRole(), etc) in the method and
somehow restore them after completing each remote call to the other ejb. Does
anyone know how to to reset these details into the current SessionContext?
Thanks,
Annie
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3993239#3993239
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3993239
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user