java - JavaEE 6 中的 JAAS 配置和 LDAP 登录模块

标签 java ldap glassfish-3 java-ee-6 jaas

我在这里写了一个问题,因为几个月来我自己都找不到解决方案。我的情况:我有一个用 Java 编写的客户端-服务器应用程序,它使用 Java2ee 6 和 EJB3.0。服务器端部署在glassfish 3.0上。我需要开发/实现应用程序的登录模块。身份验证必须使用 ldap 服务器完成,授权将在应用程序内部处理。因此,我想聘请 JAAS 技术来混合身份验证和授权。我正在这样做,例如 here .那我就关注this tutorialofficial documentation执行登录。我的问题是 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();
    }

我的 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;
};

应用程序的客户端部分使用以下 jvm 选项运行:

-Djava.security.auth.login.config=./jaas.conf  -Dorg.omg.CORBA.ORBInitialHost=localhost

在 glassfish 网站上我设置了 jvm 属性

-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf
-Djava.naming.referral=follow

glassfish 端的 login.conf 文件包含以下行(ADRealm 是我的 glassfish 的默认领域)

ADRealm {
com.sun.enterprise.security.auth.login.LDAPLoginModule REQUIRED;
};

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" />

我想强调您的注意,我正在尝试执行 ldap 登录,至少要确保它有效。

当我运行客户端时,出现以下错误:

Mar 1, 2013 1:36:44 PM com.sun.appserv.security.AppservPasswordLoginModule extractCredentials
SEVERE: passwordlm.nopwdcred
javax.security.auth.login.LoginException: No credentials.

奇怪的是,它只工作一次(!),即我可以从 lc.getSubject() 方法获得 subject。我还假设上面的 handle() 方法没有被调用,因为我没有看到

Login done.
Password done.

在输出中。

请问有人能帮帮我吗???

最佳答案

1st - 在 LDAP 上,您不使用管理员用户,而是创建另一个具有必要条件的用户,以便在必要时进行搜索和/或绑定(bind)。管理员用户不安全且不推荐使用,尤其是在 Java EE 上下文中。

第二 - 您尝试连接到哪种 LDAP 服务器? OpenLDAP 还是 Exchange 服务器?

我正在向您推荐这些链接,同时等待您的回复:

关于java - JavaEE 6 中的 JAAS 配置和 LDAP 登录模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156046/

相关文章:

java - Tomcat JDBC连接池的maven坐标是什么?

ldap - LDIF (LDAP) 属性列表

Java (Groovy) LDAP 非 ASCII 字符

使用 EJB 的 Glassfish v3 上的 Java Web 服务

java - 部署时的 Flyway 迁移 : Illegal call to close() detected

java - 如何在 MSSQL 中获取 CURRENT_DATE?

java - 在具有表格的 excel(xlsx) 工作表中写入数据

java - Integer Java 上的 boolean 逻辑非运算符

c++ winldap 不返回所有条目。停在 4000

glassfish-3 - 如何在嵌入式 Glassfish 中获取 Server.log