kar...@msn.com
unread,Feb 23, 2008, 12:00:28 AM2/23/08You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
OK, Here is my situation:<br />
<br />
<b>1. I built a custom login module as below into my EAR including a very simple EJB with declarative security done by ejb-jar.xml.</b><br />
<hr />
package tutorial;<br />
<br />
import java.io.IOException;<br />
import java.security.Principal;<br />
import java.util.Map;<br />
<br />
import javax.security.auth.Subject;<br />
import javax.security.auth.callback.Callback;<br />
import javax.security.auth.callback.CallbackHandler;<br />
import javax.security.auth.callback.NameCallback;<br />
import javax.security.auth.callback.PasswordCallback;<br />
import javax.security.auth.callback.UnsupportedCallbackException;<br />
import javax.security.auth.login.LoginException;<br />
import javax.security.auth.spi.LoginModule;<br />
<br />
import com.ibm.ws.security.common.auth.WSPrincipalImpl;<br />
import com.ibm.wsspi.security.auth.callback.WSTokenHolderCallback;<br />
<br />
public class WebsphereLoginModule implements LoginModule {<br />
private Subject subject;<br />
private CallbackHandler callbackHandler;<br />
private Map<String, ?> sharedState;<br />
private Map<String, ?> options;<br />
private boolean succeeded = false;<br />
private String username;<br />
private String password;<br />
private Principal principal;<br />
<br />
public boolean abort() throws LoginException {<br />
return true;<br />
}<br />
<br />
public boolean commit() throws LoginException {<br />
if(!succeeded) {<br />
return false;<br />
}<br />
principal = new WSPrincipalImpl("authenticated");<br />
if(!subject.getPrincipals().contains(principal)) {<br />
subject.getPrincipals().add(principal);<br />
}<br />
return true;<br />
}<br />
<br />
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {<br />
System.out.println("======================= INITIALIZING MY LOGIN MODULE =========================");<br />
this.subject = subject;<br />
this.callbackHandler = callbackHandler;<br />
this.sharedState = sharedState;<br />
this.options = options; <br />
}<br />
<br />
public boolean login() throws LoginException {<br />
if(callbackHandler == null) {<br />
throw new LoginException("Error: No CallbackHandler available");<br />
}<br />
<br />
Callback[] callbacks = new Callback[3];<br />
callbacks[0] = new WSTokenHolderCallback("");<br />
callbacks[1] = new NameCallback("user name: ");<br />
callbacks[2] = new PasswordCallback("password: ", false);<br />
<br />
<br />
try {<br />
callbackHandler.handle(callbacks);<br />
} catch (IOException e) {<br />
throw new LoginException(e.toString());<br />
} catch (UnsupportedCallbackException e) {<br />
throw new LoginException("Error" + e.getCallback().toString());<br />
}<br />
<br />
boolean requiresLogin = ((WSTokenHolderCallback) callbacks[0]).getRequiresLogin();<br />
if(requiresLogin) {<br />
username = ((NameCallback) callbacks[1]).getName();<br />
password = new String(((PasswordCallback) callbacks[2]).getPassword());<br />
((PasswordCallback) callbacks[2]).clearPassword();<br />
System.out.println("======================= username: " + username);<br />
System.out.println("======================= password: " + password);<br />
succeeded = ("max".equals(username) && "secret".equals(password));<br />
} else {<br />
succeeded = true;<br />
}<br />
<br />
return succeeded;<br />
}<br />
<br />
public boolean logout() throws LoginException {<br />
subject.getPrincipals().remove(principal);<br />
return true;<br />
}<br />
<br />
}<br />
<hr />
<br />
<b>2. Added it to "Application Logins" fellows these steps like below.</b><br />
<hr />
You can add a new application JAAS login module configuration to the list.<br />
Perform the following steps:<br />
1. Under Application login configuration, click New.<br />
2. Provide an alias name, for example: MyLoginModule.<br />
3. Click Apply. Do not click OK yet, you are going to define the login module first<br />
before you save the configuration.<br />
4. Click JAAS login modules.<br />
5. Click New in the new window.<br />
6. Provide the fully qualified name (including package name) for your custom<br />
LoginModule implementation in the Module class name field, for example:<br />
com.ibm.itso.MyLoginModuleImpl<br />
Select the Use login module proxy check box, to ensure the class visibility<br />
for applications. For more information about the login module proxy, refer to<br />
the WebSphere Information Center.<br />
Select the authentication strategy, set as REQUIRED for now. The options<br />
include: REQUIRED, REQUISITE, SUFFICIENT, and OPTIONAL. For more<br />
information about the different strategies, refer to the WebSphere Information<br />
Center.<br />
7. Click OK.<br />
8. Save the configuration for WebSphere.<br />
<br />
<b>3. Deploy to Websphere v6.1 using RAD 7, coded a thin client to test my EJB as below</b><br />
<hr />
package tutorial;<br />
<br />
import java.util.HashMap;<br />
import java.util.Hashtable;<br />
import java.util.Map;<br />
<br />
import javax.naming.Context;<br />
import javax.naming.InitialContext;<br />
import javax.rmi.PortableRemoteObject;<br />
import javax.security.auth.Subject;<br />
import javax.security.auth.callback.CallbackHandler;<br />
import javax.security.auth.login.AppConfigurationEntry;<br />
import javax.security.auth.login.Configuration;<br />
import javax.security.auth.login.LoginContext;<br />
import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;<br />
<br />
import com.ibm.websphere.security.auth.callback.WSGUICallbackHandlerImpl;<br />
<br />
public class Main {<br />
public static void main(String[] args) throws Exception {<br />
final Map<String, String> cfg = new HashMap<String, String>();<br />
cfg.put("delegate",<br />
"com.ibm.ws.sec urity.common.auth.module.WSLoginModuleImpl");<br />
Configuration configuration = new javax.security.auth.login.Configuration() {<br />
private AppConfigurationEntry[] aces = { new AppConfigurationEntry(<br />
&nb sp; "com.ibm.ws.security.common.auth.module.proxy.WSLoginModuleProxy",<br />
&nb sp; LoginModuleControlFlag.REQUIRED, cfg) };<br />
<br />
@Override<br />
public AppConfigurationEntry[] getAppConfigurationEntry(String name) {<br />
return "WSLogin".equals(name) ? aces : null;<br />
}<br />
<br />
@Override<br />
public void refresh() {<br />
}<br />
};<br />
CallbackHandler loginHandler = new WSGUICallbackHandlerImpl();<br />
Subject subject = new Subject();<br />
LoginContext lc = new LoginContext("WSLogin", subject, loginHandler,<br />
configuration); <br />
lc.login();<br />
// Subject subject = lc.getSubject();<br />
<br />
final String s = "max";<br />
Hashtable env = new Hashtable();<br />
env.put(Context.INITIAL_CONTEXT_FACTORY,<br />
"com.ibm.websph ere.naming.WsnInitialContextFactory");<br />
env.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809");<br />
Context ctx = new InitialContext(env);<br />
Object obj = ctx.lookup("ejb/tutorial/HelloHome");<br />
HelloHome home = (HelloHome) PortableRemoteObject.narrow(obj,<br />
HelloHome.class );<br />
System.out.println(home.create().hello(s));<br />
}<br />
}<br />
<hr />
<br />
<b>5. I got these error message as below, when run my client project</b><br />
<hr />
Feb 23, 2008 11:44:17 AM com.ibm.ws.util.ImplFactory<br />
WARNING: WSVR0073W<br />
Exception in thread "P=256375:O=0:CT" java.rmi.AccessException: CORBA NO_PERMISSION 0x0 No; nested exception is: <br />
org.omg.CORBA.NO_PERMISSION: <br />
>> SERVER (id=4773e3aa, host=maxop) TRACE START:<br />
>> org.omg.CORBA.NO_PERMISSION: java.rmi.AccessException: ; nested exception is: <br />
com.ibm.websphere.csi.CSIAccessException: SECJ0053E: Authorization failed for /UNAUTHENTICATED while invoking (Home)ejb/tutorial/HelloHome create:2 securityName: /UNAUTHENTICATED;accessID: UNAUTHENTICATED is not granted any of the required roles: jaasAdmin vmcid: 0x0 minor code: 0 completed: No<br />
>> at com.ibm.ws.security.core.SecurityCollaborator.performAuthorization(SecurityCollaborator.java:490)<br />
>> at com.ibm.ws.security.core.EJSSecurityCollaborator.preInvoke(EJSSecurityCollaborator.java:209)<br />
>> at com.ibm.ejs.container.EJSContainer.preInvokeForStatelessSessionCreate(EJSContainer.java:3612)<br />
>> at com.ibm.ejs.container.EJSContainer.preInvoke(EJSContainer.java:2833)<br />
>> at tutorial.EJSRemoteStatelessHelloHome_650957be.create(EJSRemoteStatelessHelloHome_650957be.java:90)<br />
>> at tutorial._EJSRemoteStatelessHelloHome_650957be_Tie.create(_EJSRemoteStatelessHelloHome_650957be_Tie.java:161)<br />
>> at tutorial._EJSRemoteStatelessHelloHome_650957be_Tie._invoke(_EJSRemoteStatelessHelloHome_650957be_Tie.java:86)<br />
>> at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:613)<br />
>> at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:466)<br />
>> at com.ibm.rmi.iiop.ORB.process(ORB.java:503)<br />
>> at com.ibm.CORBA.iiop.ORB.process(ORB.java:1552)<br />
>> at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2673)<br />
>> at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2551)<br />
>> at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:62)<br />
>> at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95)<br />
>> at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1510)<br />
>> SERVER (id=4773e3aa, host=maxop) TRACE END.<br />
vmcid: 0x0 minor code: 0 completed: No<br />
at com.ibm.CORBA.iiop.UtilDelegateImpl.mapSystemException(UtilDelegateImpl.java:254)<br />
at javax.rmi.CORBA.Util.mapSystemException(Util.java:84)<br />
at tutorial._HelloHome_Stub.create(_HelloHome_Stub.java:228)<br />
at tutorial.Main.main(Main.java:50)<br />
Caused by: org.omg.CORBA.NO_PERMISSION: <br />
>> SERVER (id=4773e3aa, host=maxop) TRACE START:<br />
>> org.omg.CORBA.NO_PERMISSION: java.rmi.AccessException: ; nested exception is: <br />
com.ibm.websphere.csi.CSIAccessException: SECJ0053E: Authorization failed for /UNAUTHENTICATED while invoking (Home)ejb/tutorial/HelloHome create:2 securityName: /UNAUTHENTICATED;accessID: UNAUTHENTICATED is not granted any of the required roles: jaasAdmin vmcid: 0x0 minor code: 0 completed: No<br />
>> at com.ibm.ws.security.core.SecurityCollaborator.performAuthorization(SecurityCollaborator.java:490)<br />
>> at com.ibm.ws.security.core.EJSSecurityCollaborator.preInvoke(EJSSecurityCollaborator.java:209)<br />
>> at com.ibm.ejs.container.EJSContainer.preInvokeForStatelessSessionCreate(EJSContainer.java:3612)<br />
>> at com.ibm.ejs.container.EJSContainer.preInvoke(EJSContainer.java:2833)<br />
>> at tutorial.EJSRemoteStatelessHelloHome_650957be.create(EJSRemoteStatelessHelloHome_650957be.java:90)<br />
>> at tutorial._EJSRemoteStatelessHelloHome_650957be_Tie.create(_EJSRemoteStatelessHelloHome_650957be_Tie.java:161)<br />
>> at tutorial._EJSRemoteStatelessHelloHome_650957be_Tie._invoke(_EJSRemoteStatelessHelloHome_650957be_Tie.java:86)<br />
>> at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:613)<br />
>> at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:466)<br />
>> at com.ibm.rmi.iiop.ORB.process(ORB.java:503)<br />
>> at com.ibm.CORBA.iiop.ORB.process(ORB.java:1552)<br />
>> at com.ibm.rmi.iiop.Connection.respondTo(Connection.java:2673)<br />
>> at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2551)<br />
>> at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:62)<br />
>> at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95)<br />
>> at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1510)<br />
>> SERVER (id=4773e3aa, host=maxop) TRACE END.<br />
vmcid: 0x0 minor code: 0 completed: No<br />
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)<br />
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67)<br />
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)<br />
at java.lang.reflect.Constructor.newInstance(Constructor.java:521)<br />
at com.ibm.rmi.iiop.ReplyMessage._getSystemException(ReplyMessage.java:241)<br />
at com.ibm.rmi.iiop.ReplyMessage.getSystemException(ReplyMessage.java:189)<br />
at com.ibm.rmi.iiop.ClientResponseImpl.getSystemException(ClientResponseImpl.java:232)<br />
at com.ibm.rmi.corba.ClientDelegate.invoke(ClientDelegate.java:534)<br />
at com.ibm.CORBA.iiop.ClientDelegate.invoke(ClientDelegate.java:1150)<br />
at com.ibm.rmi.corba.ClientDelegate.invoke(ClientDelegate.java:756)<br />
at com.ibm.CORBA.iiop.ClientDelegate.invoke(ClientDelegate.java:1180)<br />
at org.omg.CORBA.portable.ObjectImpl._invoke(ObjectImpl.java:484)<br />
at tutorial._HelloHome_Stub.create(_HelloHome_Stub.java:215)<br />
... 1 more<br />
<hr />
<b>6. And none of "System.out.println" in my WebsphereLoginModule.java was executed.</b><br />
<br />
So, my problem is how to make Websphere to call my WebsphereLoginModule instand of the default one when I try to call my EJB.