Posted By:
Sean_Sullivan
Posted On:
Wednesday, February 27, 2002 08:37 AM
I am using Sun JDK 1.4.0 on Windows 2000.
I would like to be able authenticate NT users via the JAAS API and NTLM.
Is this possible?
I want users to be able to enter their username and password so that I can authenticate them via NTLM.
My (naively written) sample app is included below...
///////////////////////////////////////////////////////////////////////////
package experimental.jaastest;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.security.auth.*;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.callback.Callback;
import javax.security.auth.login.*;
import java.util.*;
import com.sun.security.auth.NTUserPrincipal;
/**
*
*
* @author: Sean C. Sullivan
*
*/
public class JaasTest extends javax.swing.JFrame
{
public static class LoginCallbackHandler implements javax.security.auth.callback.CallbackHandler
{
public void handle(Callback[] callbacks)
throws java.io.IOException, UnsupportedCallbackException
{
System.out.println("callbacks.length " + callbacks.length);
for (int i = 0; i < callbacks.length; i++)
{
System.out.println(callbacks[i]);
}
}
}
public static class NTLMConfiguration extends javax.security.auth.login.Configuration
{
private static final String strLoginModuleName = "com.sun.security.auth.module.NTLoginModule";
private static final AppConfigurationEntry[] entries;
static
{
Map mOptions = new HashMap();
mOptions.put("debug", "true");
entries = new AppConfigurationEntry[1];
entries[0] = new AppConfigurationEntry(
strLoginModuleName,
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
mOptions);
}
public NTLMConfiguration()
{
}
public AppConfigurationEntry[] getAppConfigurationEntry(String appName)
{
// we ignore the appName parameter value
return entries;
}
public void refresh()
{
// empty method
}
}
public static class NTLMAuthenticationPanel extends javax.swing.JPanel
{
public NTLMAuthenticationPanel()
{
this.setLayout(new java.awt.BorderLayout());
JButton btnLogin = new JButton("Go");
btnLogin.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
LoginContext lc = null;
Configuration cfg = Configuration.getConfiguration();
AppConfigurationEntry[] acEntries = cfg.getAppConfigurationEntry(null);
for (int i = 0; i < acEntries.length; i++)
{
System.out.println("Login module name: "
+ acEntries[i].getLoginModuleName());
}
try
{
Set principalSet = new java.util.HashSet();
Set pubCredentialSet = new java.util.HashSet();
Set privateCredentialSet = new java.util.HashSet();
java.security.Principal p = new NTUserPrincipal("foobaruser");
Subject subj = new Subject(
false /* read-only */,
principalSet,
pubCredentialSet,
privateCredentialSet);
lc = new LoginContext(
"appName",
subj,
new LoginCallbackHandler());
lc.login();
}
catch (LoginException ex)
{
System.out.println(ex);
}
catch (SecurityException ex)
{
System.out.println(ex);
}
}
});
this.add(btnLogin);
}
}
public JaasTest()
{
this.getContentPane().add(new NTLMAuthenticationPanel());
}
/**
* main application method
* @param args an array of command-line arguments
*/
public static void main(java.lang.String[] args) {
Configuration.setConfiguration(new NTLMConfiguration());
javax.swing.JFrame f = new JaasTest();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(600, 500);
f.setTitle("JAAS Test");
f.setVisible(true);
}
}
///////////////////////////////////////////////////////////////////////////
/*
Related resources:
http://www.jguru.com/forums/view.jsp?EID=398647
http://www.jguru.com/forums/view.jsp?EID=706540
http://www.jguru.com/forums/view.jsp?EID=439210
http://java.sun.com/j2se/1.4/docs/guide/security/jaas/spec/com/sun/security/auth/NTUserPrincipal.html
http://java.sun.com/j2se/1.4/docs/api/javax/security/auth/package-summary.html
http://java.sun.com/j2se/1.4/docs/api/javax/security/auth/login/package-summary.html
http://java.sun.com/j2se/1.4/docs/guide/security/jaas/JAASRefGuide.html
*/