JAAS额外的LoginModules

时间:2011-12-07 11:07:06

标签: java login ldap jaas

我想知道如何结合这两个身份验证步骤:

  1. 检查LDAP中的用户/密码
  2. 将DB中找到的主体(角色)添加到主题中。
  3. LDAP用户存储库不知道应用程序特定的角色,我不想管理应用程序数据库中的密码。所以我需要两个。

    JAAS配置文件允许使用其他LoginModule:

    <name used by application to refer to this entry> { 
        <LoginModule> <flag> <LoginModule options>;
        <optional additional LoginModules, flags and options>;
    };
    

    但我找不到解释我如何运作的例子。

    这是好方法吗?

    由于

    =========================================

    以下是我的回答:

    确实我们可以有额外的LoginModule。 JAAS配置文件是:

    Sample {
      com.sun.security.auth.module.LdapLoginModule Requisite
      userProvider="ldap://acme.org:389/OU=Users,OU=_ACME,DC=acmegis,DC=acme,DC=org"
      authIdentity="{USERNAME}"
      userFilter="(userPrincipalName={USERNAME})"
      storePass=true
    
      sample.module.SampleLoginModule required debug=true;
    };
    

    这里有两个LoginModule:

    Sun的LdapLoginModule检查用户/密码, 和我的sample.module.SampleLoginModule查询我的数据库并填充主体。 storePass = true的重要参数要求LdapLoginModule将用户名和密码存储在模块的共享状态中。 (见http://docs.oracle.com/javase/6/docs/jre/api/security/jaas/spec/com/sun/security/auth/module/LdapLoginModule.html)。

    因此,下一个LoginModules可以获取传递给sharedState Map参数中的initialize方法的用户名。它们应该在login()中无关,而在DB中用于填充Principales的查询是在commit()中完成的(就像Shimi Bandiel所说)。

    我还没有使用它,但有一个由JBoss开发的DatabaseServerLoginModule(参见http://community.jboss.org/wiki/DatabaseServerLoginModule),它支持身份验证和角色映射。与password-stacking = useFirstPass一起使用,我们应该得到我的需要,而不需要编写任何行代码(但是一个漂亮的JAAS配置文件)。

    B.R。

2 个答案:

答案 0 :(得分:1)

您应该在LoginModule方法中实现login,您可以访问LDAP并检查用户名/密码,并使用commit方法访问数据库并填写主体。
这里不需要使用多个LoginModule

答案 1 :(得分:0)

很棒! 但是实现LoginModule可以让您更有力地自定义与LDAP服务器交互的方式 我也和你一样挣扎同样的问题。 但请记住,在实现LoginModule时,您应该在login()函数中添加角色,而不是在commit()中添加角色,否则您的子喷射将无法获取主体。