On Jun 19, 2009, at 6:44 AM, kistler wrote:


Hello,

I'm currently developing an Enterprise application which Comprises of a servlet and ejb for Geronimo 2.1 and I have secured the Ejb with a Security Realm configured to authenticate against a SQLLoginModule. I'm confident that this is authenticating correctly as I have done negative and positive
testing.

I'm testing my ejb my connecting to it from a servlet as follows:

                CallbackHandler handler = new 
UserIdPasswordCallbackHandler(user,
password);
                LoginContext ctx = new LoginContext("SecurityRealm",handler);
                ctx.login();

This succeeds when supplied the correct credentials and throws exceptions
with invalid credentials.

I assume this is a standalone test not part of your application? Doing this will not tell geronimo anything about the Subject you have created and your ejb will not be secured from the servlet.


I obtain a reference to the remote interface as follows:

Properties prop=new Properties();
                        prop.put(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.openejb.client.RemoteInitialContextFactory");
                        prop.put("java.naming.provider.url", 
"ejbd://localhost:4201");
                        Context context = new InitialContext(prop);

Object o = context.lookup("SessionManagerBeanRemote");
SessionManagerRemote remote = (SessionManagerRemote)o;

This works correctly as I am able to call my remote ejb methods!

yes, and there is no security in place. If you are calling from the servlet you did the test login from, the Subject info will not be propagated to the ejb container.


Now - the piece I am missing is I need to be able to obtain the current Subject that was authenticated. ie - I need to know the identity of the user that has been authenticated to use this ejb and is invoking it. So if
joe was authenticated to use the SessionManager - I need to be able to
obtain joe's login name.

You probably want first to set up container managed security. Easiest is to use one of the built in authentication methods for the web app. If you don't like this, you should call one of the geronimo ContextManager.login methods for your login and then

Callers oldCallers = ContextManager.setCallers(subject, subject);
try {
//do secured stuff like calling the ejb
} finally {
  ContextManager.popCallers(oldCallers);
}

Or if you are adventurous you can use (unreleased) geronimo 2.2 + jetty7 with a jaspic authentication module.

At this point, Juergens suggestion of using sessionContext.getCallerPrincipal() in the ejb will work.

thanks
david jencks

I believe if I was within a web container I'd be able to use the equivalent of: HttpServletRequest.getUserPrincipal() ... Can someone point me to a reference, decently documented example or something that will tell me what API I need to use? I'm happy to do some reading but I've looked around quite a bit and I think I might be missing something... There doesn't seem to be a clear reference to this is the standard geronimo documentation -
only some lite discussion for web containers.

Thanks in advance!
-Keith
--
View this message in context: 
http://www.nabble.com/Trouble-obtaining-JaaS-login-context-from-within-EJB-tp24111796s134p24111796.html
Sent from the Apache Geronimo - Users mailing list archive at Nabble.com.

Reply via email to