JAAS login with glassfish 5, JEE 8 and standalone application

395 Views Asked by At

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");
                }

            }
        }
    }
}
0

There are 0 best solutions below