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 个模块:
org.apache.karaf.jaas.modules.ldap.LDAPLoginModule
的一个实例,用于通过 LDAP 到 Active-Directory 对用户进行身份验证 link
MyCustomLoginModule extends AbstractKarafLoginModule
- 第二个模块,用于检查本地定义的真实用户角色。
后者工作正常。但是,当 LDAPLoginModule 无法验证用户时,他们仍然可以通过。 无论我对 2 个模块使用 和顺序的何种组合 required/requisite 都是这种情况。
行为示例:
我这样定义我的模块:
<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>
此蓝图文件和 MyCustomLoginModule 位于已添加到功能的捆绑包中,该功能本身已与关联的远程 mvn 存储库一起添加到 etc/org.apache.karaf.features.cfg
- 我将
"userX=admin"
放入 MyCustomLoginModule 用于分配角色的平面文件中。
- 我尝试以 userX 身份登录(通过 hawtio web 控制台),但输入了错误的密码。
记录的输出如下:
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”错误代码 ^^
- 然而,执行继续并且我作为 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。
TL;DR: 为什么当用户身份验证失败时 LDAPLoginModule(显然)不抛出 FailedLoginException
?
我已经在 jboss fuse 6.2.[0|1] 中覆盖了默认的 "karaf" jaas 领域。我的配置有 2 个模块:
org.apache.karaf.jaas.modules.ldap.LDAPLoginModule
的一个实例,用于通过 LDAP 到 Active-Directory 对用户进行身份验证 linkMyCustomLoginModule extends AbstractKarafLoginModule
- 第二个模块,用于检查本地定义的真实用户角色。
后者工作正常。但是,当 LDAPLoginModule 无法验证用户时,他们仍然可以通过。 无论我对 2 个模块使用 和顺序的何种组合 required/requisite 都是这种情况。
行为示例:
我这样定义我的模块:
<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" > . . .
</blueprint><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>
此蓝图文件和 MyCustomLoginModule 位于已添加到功能的捆绑包中,该功能本身已与关联的远程 mvn 存储库一起添加到
etc/org.apache.karaf.features.cfg
- 我将
"userX=admin"
放入 MyCustomLoginModule 用于分配角色的平面文件中。 - 我尝试以 userX 身份登录(通过 hawtio web 控制台),但输入了错误的密码。
记录的输出如下:
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”错误代码 ^^
- 然而,执行继续并且我作为 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。