From | Sent On | Attachments |
---|---|---|
glas...@javadesktop.org | Dec 24, 2007 6:12 pm | |
glas...@javadesktop.org | Dec 26, 2007 11:27 pm | |
glas...@javadesktop.org | Jan 2, 2008 9:15 am |
Subject: | glassfish, jdbcRealm, custom GUI login dialog.Error: No LoginModules config | ![]() |
---|---|---|
From: | glas...@javadesktop.org (glas...@javadesktop.org) | |
Date: | Dec 24, 2007 6:12:19 pm | |
List: | net.java.dev.glassfish.users |
I have written an application with a secure EJB3 module and a swing GUI app
client that is run via java webstart. Everything works great, with
authentication for test users allowing me access to the secure EJB. I am using
netbeans 6 and glassfish v2 with java 1.5
The problem is that I want to customize the GUI login dialog that pops up. The
default GUI login dialog that glassfish provides is not sufficient. I have
implemented a callback function and when I run it I get and exception (all can
be seen below): "No LoginModules configured".
I want to keep using the LoginModules in glassfish with the jdbcrealm and don't
want to write one myself, so I don't know how to proceed. Where do I tell my
code to just use the default login module that glassfish was using before?
I have the following callback code:
/** * JOnAS: Java(TM) Open Application Server * Copyright (C) 1999-2004 Bull S.A. * Contact: jona...@objectweb.org * * License: GPL V2 */
package ca.littleriver.bovinemanagement.appclient;
import java.awt.GridLayout;
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.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class DialogCallbackHandler implements CallbackHandler {
private JTextField loginField = null;
private JTextField passwordField = null;
private boolean cancelled = false;
private String title = "David's Login Dialog";
private String username = "Username ";
private String password = "Password ";
private String loginButton = "Duhh Login !";
private String cancelButton = "Cancel";
private static final int MAX_FIELD_LENGTH = 20;
private int passwordLength = MAX_FIELD_LENGTH;
private int usernameLength = MAX_FIELD_LENGTH;
private char echoChar = '*';
private boolean echoCharOn = false;
private String[] connectOptionNames;
public DialogCallbackHandler() {
super();
int i = 0;
connectOptionNames = new String[2];
connectOptionNames[i] = loginButton;
connectOptionNames[++i] = cancelButton;
}
public DialogCallbackHandler(String title) {
this();
this.title = title;
}
public DialogCallbackHandler(String title, String username, String password)
{
this();
this.title = title;
this.username = username;
this.password = password;
}
public DialogCallbackHandler(String title, String username, String password,
String loginButton, String cancelButton, int usernameLength, int passwordLength,
char echoChar) {
this(title, username, password);
this.echoCharOn = true;
this.echoChar = echoChar;
this.loginButton = loginButton;
this.cancelButton = cancelButton;
this.passwordLength = passwordLength;
this.usernameLength = usernameLength;
this.echoChar = echoChar;
}
private void dialogInit(boolean isEchoOn) {
echoCharOn = (isEchoOn || echoCharOn);
dialogInit();
}
private void dialogInit() {
JLabel userNameLabel = new JLabel(username, JLabel.RIGHT);
loginField = new JTextField("");
JLabel passwordLabel = new JLabel(password, JLabel.RIGHT);
if (!echoCharOn) {
passwordField = new JPasswordField(passwordLength);
((JPasswordField)passwordField).setEchoChar(echoChar);
} else {
passwordField = new JTextField(passwordLength);
}
JPanel connectionPanel = new JPanel(false);
connectionPanel.setLayout(new BoxLayout(connectionPanel,
BoxLayout.X_AXIS));
JPanel namePanel = new JPanel(false);
namePanel.setLayout(new GridLayout(0, 1));
namePanel.add(userNameLabel);
namePanel.add(passwordLabel);
JPanel fieldPanel = new JPanel(false);
fieldPanel.setLayout(new GridLayout(0, 1));
fieldPanel.add(loginField);
fieldPanel.add(passwordField);
connectionPanel.add(namePanel);
connectionPanel.add(fieldPanel);
int choice = JOptionPane.showOptionDialog(null, connectionPanel, title,
JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
connectOptionNames, loginField);
if (choice == JOptionPane.OK_OPTION) {
cancelled = false;
} else if (choice == JOptionPane.CANCEL_OPTION) {
cancelled = true;
} else if (choice == JOptionPane.CLOSED_OPTION) {
cancelled = true;
} else {
cancelled = true;
}
if (cancelled) {
loginField.setText("Invalid");
passwordField.setText("Invalid");
}
}
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
if (cancelled) {
return;
}
int i = 0;
boolean found = false;
while ((i < callbacks.length) && !found) {
if (callbacks[i] instanceof PasswordCallback) {
found = true;
dialogInit(((PasswordCallback)callbacks[i]).isEchoOn());
}
i++;
}
if (!found) {
dialogInit();
}
for (i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
((NameCallback)callbacks[i]).setName(loginField.getText());
} else if (callbacks[i] instanceof PasswordCallback) {
((PasswordCallback)callbacks[i]).setPassword((passwordField.getText()).toCharArray());
} else {
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
}
}
} /**************************************** */
After I see the login window from the above code I get the following exception:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at com.sun.enterprise.appclient.jws.boot.JWSACCMain.run(JWSACCMain.java:218)
at com.sun.enterprise.appclient.jws.boot.JWSACCMain.main(JWSACCMain.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1171)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1118)
at com.sun.javaws.Launcher.continueLaunch(Launcher.java:961)
at com.sun.javaws.Launcher.handleApplicationDesc(Launcher.java:515)
at com.sun.javaws.Launcher.handleLaunchFile(Launcher.java:218)
at com.sun.javaws.Lau
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at com.sun.enterprise.appclient.jws.boot.JWSACCMain.run(JWSACCMain.java:218)
at com.sun.enterprise.appclient.jws.boot.JWSACCMain.main(JWSACCMain.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1171)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1118)
at com.sun.javaws.Launcher.continueLaunch(Launcher.java:961)
at com.sun.javaws.Launcher.handleApplicationDesc(Launcher.java:515)
at com.sun.javaws.Launcher.handleLaunchFile(Launcher.java:218)
at com.sun.javaws.Launcher.run(Launcher.java:165)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.RuntimeException:
java.lang.reflect.InvocationTargetException
at
com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:428)
... 17 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.sun.enterprise.util.Utility.invokeApplicationMain(Utility.java:266)
at
com.sun.enterprise.appclient.MainWithModuleSupport.<init>(MainWithModuleSupport.java:417)
... 17 more
Caused by: javax.security.auth.login.LoginException: No LoginModules configured
for k
at javax.security.auth.login.LoginContext.init(LoginContext.java:256)
at javax.security.auth.login.LoginContext.<init>(LoginContext.java:334)
at ca.littleriver.bovinemanagement.appclient.Main.<init>(Main.java:77)
at ca.littleriver.bovinemanagement.appclient.Main.main(Main.java:186)
... 23 more
[Message sent by forum member 'dwaddy' (dwaddy)]