Ole*_*leg 11 java ldap jaas java-ee-6 glassfish-3
我在这里写一个问题,因为我自己几个月都找不到解决方案.我的情况:我有一个用java编写的客户端服务器应用程序,它使用Java2ee 6和EJB3.0.服务器端部署在glassfish 3.0上.我需要为应用程序开发/实现登录模块.必须使用ldap服务器进行身份验证,并在应用程序内部处理授权.因此,我想聘请JAAS技术来进行身份验证和授权.我这样做是为了例如像在这里.然后我按照本教程和官方文档进行登录.我的问题是ldap登录不起作用.
我的代码:
LoginContext lc = null;
try {
CallbackHandler handler = new CallbackHandler() {
public void handle(Callback[] callbacks) throws UnsupportedCallbackException {
for( int i = 0; i < callbacks.length; i++ ) {
if( callbacks[i] instanceof NameCallback ) {
// prompt the user for a username
NameCallback nc = (NameCallback)callbacks[i];
nc.setName("admin");
System.out.println("Login done.");
} else if( callbacks[i] instanceof PasswordCallback ) {
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
pc.setPassword("mypassword".toCharArray());
System.out.println("Password done.");
} else {
throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
} //end if/else
} //end for()
}
};
lc = new LoginContext("myAuth", handler);
lc.login();
Subject subject = lc.getSubject();
} catch (LoginException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我的JAAS配置文件:
myAuth {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED
userProvider="ldap://mydomain:389/OU=users,DC=my,DC=domain,DC=com"
authIdentity="{USERNAME}"
useSSL=false
debug=true;
};
Run Code Online (Sandbox Code Playgroud)
应用程序的客户端部分使用以下jvm选项运行:
-Djava.security.auth.login.config=./jaas.conf -Dorg.omg.CORBA.ORBInitialHost=localhost
Run Code Online (Sandbox Code Playgroud)
在glassfish网站上我设置了jvm属性
-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf
-Djava.naming.referral=follow
Run Code Online (Sandbox Code Playgroud)
glassfish端的login.conf文件包含以下行(ADRealm是我的glassfish的默认域)
ADRealm {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED;
};
Run Code Online (Sandbox Code Playgroud)
ADRealm的设置:
<property name="jaas-context" value="ldapRealm" />
<property name="base-dn" value="CN=users,DC=my,DC=domain,DC=com" />
<property name="directory" value="ldap://mydomain:3268" />
<property name="search-bind-password" value="mypassword" />
<property name="search-bind-dn" value="admin@my.domain.com" />
Run Code Online (Sandbox Code Playgroud)
我想强调你的注意力,我正在尝试执行ldap登录,至少确保它有效.
当我运行客户端时,我收到以下错误:
Mar 1, 2013 1:36:44 PM com.sun.appserv.security.AppservPasswordLoginModule extractCredentials
SEVERE: passwordlm.nopwdcred
javax.security.auth.login.LoginException: No credentials.
Run Code Online (Sandbox Code Playgroud)
什么是奇怪的一次(!),即我可以subject从lc.getSubject()方法获得.另外我假设handle()没有调用上面的方法,因为我没有看到
Login done.
Password done.
Run Code Online (Sandbox Code Playgroud)
在输出中.
请有人帮帮我吗???
小智 0
第一 - 在 LDAP 上,您不使用管理员用户,而是创建另一个具有必要条件的用户,以便在必要时进行搜索和/或绑定。管理员用户不安全,不推荐使用,尤其是在 Java EE 上下文中。
第二 - 您尝试连接到哪种类型的 LDAP 服务器?OpenLDAP 还是 Exchange 服务器?
在等待您的回复时,我将向您推荐这些链接:
http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/JAASLMDevGuide.html
http://docs.oracle.com/javase/6/docs/technotes/guides/security/jaas/tutorials/GeneralAcnOnly.html