required 或 requisite jaas LDAPLoginModule 在用户身份验证失败时不抛出 FailedLoginException

required or requisite jaas LDAPLoginModule not throwing FailedLoginException when user fails authentication

TL;DR: 为什么当用户身份验证失败时 LDAPLoginModule(显然)不抛出 FailedLoginException


我已经在 jboss fuse 6.2.[0|1] 中覆盖了默认的 "karaf" jaas 领域。我的配置有 2 个模块:

后者工作正常。但是,当 LDAPLoginModule 无法验证用户时,他们仍然可以通过。 无论我对 2 个模块使用 和顺序的何种组合 required/requisite 都是这种情况。


行为示例:

  1. 我这样定义我的模块:

    
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0"
               xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
               xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
               xsi:schemaLocation="
                   http://www.osgi.org/xmlns/blueprint/v1.0.0
                   http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd" >  
        . . .  
    
    
    <jaas:config . . . >
    
        . . .
    
        <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule"
                     flags="requisite">
    
             . . .
    
             properties herein as commonly seen for ldap-ad
    
             . . .
    
        </jaas:module>
        <jaas:module className="com.abc.xyz.MyCustomLoginModule"
                     flags="requisite">
    
            . . . nothing shocking in here either . . .
    
        </jaas:module>
    </jaas:config>
    
    </blueprint>
  2. 此蓝图文件和 MyCustomLoginModule 位于已添加到功能的捆绑包中,该功能本身已与关联的远程 mvn 存储库一起添加到 etc/org.apache.karaf.features.cfg

  3. 我将 "userX=admin" 放入 MyCustomLoginModule 用于分配角色的平面文件中。
  4. 我尝试以 userX 身份登录(通过 hawtio web 控制台),但输入了错误的密码。
  5. 记录的输出如下:

    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Get the user DN.
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Bind user (authentication).
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Setting up SSL
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Set the security principal for CN=...
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Binding the user.
    WARN  | LDAPLoginModule | org.apache.karaf.jaas.modules | User userX authentication failed.
    javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr:
     DSID-0C0903D9, comment: AcceptSecurityContext error, data 52e, v2580]
    

^^ 正如预期的那样,LDAP 身份验证失败——根据 WARN 消息和“52e”错误代码 ^^

  1. 然而,执行继续并且我作为 userX 成功登录到 hawtio web 控制台!

或者,我可以在我的自定义本地文件中定义一个用户=角色映射,其中用户甚至不存在于我们的 Active Directory 中……一些简单的东西,例如:admin=admin。然后我经历同样的过程。这次 LDAP 模块没有抛出异常,但记录:

WARN  | LDAPLoginModule | org.apache.karaf.jaas.modules | User admin not found in LDAP.
但又一次,执行继续,我成功登录到 hawtio web 控制台,这次是 "admin."

最后...使用有效的 Active Directory 用户,但不是在我的自定义本地文件中定义的用户,会产生预期的日志记录,例如:

DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Get the user DN.
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Setting up SSL
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Looking for the user in LDAP with
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules |   base DN:XXXXXXXXXX
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules |   filter: (&(|(samAccountName=<valid-username>)(userPrincipalName=<valid-username>)(cn=<valid-username>))(objectClass=user))
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Found the user DN.
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Bind user (authentication).
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Setting up SSL
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Set the security principal for CN=<valid-username>,...
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Binding the user.
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | User <valid-username> successfully bound.
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Setting up SSL
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules | Looking for the user roles in LDAP with
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules |   base DN:XXXXXXXX
    DEBUG | LDAPLoginModule | org.apache.karaf.jaas.modules |   filter: (uniqueMember=CN=<valid-username>)
    WARN  | Authenticator   | io.hawt.hawtio-web            | Login failed due User <valid-username> has no local roles defined

最后一行是因为如果用户没有在上述自定义文件中定义的角色

,我的模块将抛出 FailedLoginException

我还注意到,如果 LDAPLoginModule 的配置错误——例如,为用户搜索 ldap 的系统帐户提供了错误的密码——那么它确实会通过抛出 FailedLoginExcpetion 来停止登录过程,例如:

WARN  | Authenticator   | io.hawt.hawtio-web            | Login failed due Can't connect to
the LDAP server: [LDAP: error code 49 - 80090308: LdapErr:
DSID-0C0903D9, comment: AcceptSecurityContext error, data 52e, v2580]

请注意,这是由身份验证器记录的(不是上面的 LDAPLoginModule

...所以最后,问题是——为什么 LDAPLoginModule(显然)在用户未通过身份验证时不抛出 FailedLoginException?我认为这是所需要的——有人不同意吗? LDAPLoginModule 是否需要一些额外的配置才能生效?

有其他人在使用 JBoss FUSE v6.2.1 或 karaf v2.4 时遇到过这个问题吗?你能在那个版本中解决吗?如果不是,是否通过升级到更新版本的任一版本解决了这个问题?

谢谢, 汉斯

虽然不是所问问题的确切答案,但以下是一个有效的解决方法。

不是直接使用 LDAPLoginModule,而是创建一个扩展它的 class 和 @Override login() 方法--其中 returns 一个布尔值。 .. 如果要搜索的用户不存在或提供的密码不正确,则此布尔值设置为 false。因此,只需调用 super.login(),如果结果为假,则抛出 FailedLoginException。