TL;博士:
为什么LDAPLoginModule(显然)不抛出
FailedLoginException
当用户身份验证失败时?
-
实例
org.apache.karaf.jaas.modules.ldap.LDAPLoginModule
要通过LDAP到Active Directory链接验证用户,请执行以下操作:
-
MyCustomLoginModule extends AbstractKarafLoginModule
-第二模块,用于检查真实用户的本地定义角色。
后者效果很好。但是,当LDAPLoginModule无法对用户进行身份验证时,仍然允许他们通过
无论我使用的是所需/必需和订购的组合
对于2个模块。
行为示例:
-
我的模块定义如下:
<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位于已添加到功能的包中,该功能本身已添加到
etc/org.apache.karaf.features.cfg
以及相关的远程mvn repo
-
我说
"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身份验证失败——根据警告消息和“52e”错误代码^^
-
然而
或者,我可以在我的自定义本地文件中定义用户=角色映射,其中用户甚至不存在于我们的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中遇到过这个问题?您是否能够在该版本中解决问题?如果不是,是否通过升级到更新的版本来解决?
谢谢
汉斯