代码之家  ›  专栏  ›  技术社区  ›  Hans.Loven.work

必需或必需的jaas LDAPLoginModule在用户身份验证失败时不抛出FailedLoginException

  •  0
  • Hans.Loven.work  · 技术社区  · 8 年前

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


    • 实例 org.apache.karaf.jaas.modules.ldap.LDAPLoginModule 要通过LDAP到Active Directory链接验证用户,请执行以下操作:
    • MyCustomLoginModule extends AbstractKarafLoginModule -第二模块,用于检查真实用户的本地定义角色。

    后者效果很好。但是,当LDAPLoginModule无法对用户进行身份验证时,仍然允许他们通过 无论我使用的是所需/必需和订购的组合 对于2个模块。


    行为示例:

    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位于已添加到功能的包中,该功能本身已添加到 etc/org.apache.karaf.features.cfg 以及相关的远程mvn repo

    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身份验证失败——根据警告消息和“52e”错误代码^^

    1. 然而

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

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

    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用户的系统帐户提供了错误的密码——那么它确实会通过抛出FailedLoginException来停止登录过程,如:

    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

    有没有其他人在JBoss FUSE v6.2.1或karaf v2.4中遇到过这个问题?您是否能够在该版本中解决问题?如果不是,是否通过升级到更新的版本来解决?

    谢谢 汉斯

    1 回复  |  直到 8 年前
        1
  •  0
  •   Hans.Loven.work    8 年前

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

    不要直接使用LDAPLoginModule,而是创建一个扩展它的类并@Override login()方法-- 它返回一个布尔值