I am using glassfish 5, with JEE 8 with EJB 3
I am using a jdbc realm using posgres. I have already setup my realm in the glassfish admin interface.
I have an ear which contain an ejb jar and a war. The realm works well with the web app
But now I have to setup a standalone app to connect with the server. I have created a simple test standalone client to try to connect using LoginContext but I cannot get it to work with my standalone application. I keep getting this error.
Jul 27, 2018 11:50:54 AM com.sun.enterprise.security.BasePasswordLoginModule extractCredentials
SEVERE: A PasswordCredential was required but not provided.
javax.security.auth.login.LoginException: No credentials.
at com.sun.enterprise.security.BasePasswordLoginModule.extractCredentials(BasePasswordLoginModule.java:342)
at com.sun.enterprise.security.BasePasswordLoginModule.login(BasePasswordLoginModule.java:142)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:587)
at com.test.test.TestLogin.jaasLogin(TestLogin.java:33)
at com.test.test.TestLogin.main(TestLogin.java:22
What I am missing?
Here are the source code
jaas.config
my_realm {
com.sun.enterprise.security.ee.auth.login.JDBCLoginModule
required
debug="true"
;
};
Standalone Client code
package com.test.test;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.LoginContext;
public class TestLogin
{
static LoginContext loginContext;
public static void main(String[] args)
{
System.setProperty("java.security.auth.login.config", "/tmp/jaas.config");
System.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
System.out.println(jaasLogin("Test", "Test", "localhost"));
}
static public boolean jaasLogin(String login, String password, String server)
{
System.out.println("Server = " + server);
CallbackHandler handler = new MyCallbackHandler(login, password);
try
{
loginContext = new LoginContext("my_realm", handler);
loginContext.login();
System.out.println("JAAS : login succeeded");
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
static class MyCallbackHandler implements CallbackHandler
{
/**
* Username which will be set in the NameCallback, when NameCallback is
* handled
*/
private String username;
/**
* Password which will be set in the PasswordCallback, when PasswordCallback
* is handled
*/
private String password;
/**
* Constructor
*
* @param username
* The username
* @param password
* The password
*/
public MyCallbackHandler(String username, String password)
{
this.username = username;
this.password = password;
}
/**
* @param callbacks
* Instances of Callbacks
* @throws IOException
* IOException
* @throws UnsupportedCallbackException
* If Callback is other than NameCallback or PasswordCallback
*/
public void handle(Callback callbacks[])
throws IOException, UnsupportedCallbackException
{
for (int i = 0; i < callbacks.length; i++)
{
if (callbacks[i] instanceof NameCallback)
{
NameCallback nc = (NameCallback) callbacks[i];
nc.setName(username);
}
else if (callbacks[i] instanceof PasswordCallback)
{
PasswordCallback pc = (PasswordCallback) callbacks[i];
pc.setPassword(password.toCharArray());
}
else
{
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
}
}
}
}