You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LDAP用户组映射到Wildfly角色(Kerberos认证场景)

Wildfly 18 Kerberos认证后LDAP用户组映射角色解决方案

核心思路

Wildfly的安全域支持独立配置认证(Authentication)和授权(Authorization)模块,你已经完成了Kerberos认证流程,仅需额外叠加LDAP组映射的授权模块即可,不需要修改现有Kerberos认证的配置。

具体配置步骤

2.1 备份现有配置

先备份你的standalone.xml(domain模式下备份对应域配置文件),避免配置错误导致服务无法启动。

2.2 修改安全域配置

可以通过jboss-cli命令行或者直接修改配置文件两种方式操作:

方式一:jboss-cli命令配置(推荐,避免配置格式错误)

启动Wildfly后执行以下命令,注意替换你实际的LDAP参数:

# 进入batch模式,避免部分命令执行失败残留错误配置
batch
# 假设你现有Kerberos安全域名称是KerberosDomain,替换为你实际的安全域名
/subsystem=security/security-domain=KerberosDomain/authentication=classic/login-module=LdapGroupsMapping:add(code="org.jboss.security.auth.spi.LdapGroupsMappingLoginModule", flag="optional", module="org.jboss.as.security", module-options=[
    "java.naming.factory.initial"="com.sun.jndi.ldap.LdapCtxFactory",
    "java.naming.provider.url"="ldap://你的LDAP服务器地址:389",
    "java.naming.security.authentication"="simple",
    # 绑定LDAP的查询用户DN,需具备用户组查询权限
    "bindDN"="cn=查询账号,ou=users,dc=你的域,dc=com",
    "bindCredential"="查询账号密码",
    # 用户搜索基础DN
    "baseCtxDN"="ou=users,dc=你的域,dc=com",
    # 匹配用户的属性,Kerberos认证返回的用户名和LDAP用户属性对应即可
    "uidAttributeID"="sAMAccountName",
    # 组搜索基础DN
    "rolesCtxDN"="ou=groups,dc=你的域,dc=com",
    # 组属性中存储用户的字段
    "roleAttributeID"="member",
    # 组名对应的属性,即要映射为Wildfly角色的字段,一般用cn
    "roleNameAttributeID"="cn",
    # 递归搜索组
    "searchScope"="SUBTREE_SCOPE",
    # 配置是否把LDAP组名直接作为Wildfly角色,设为true即可
    "rolesAreRoles"="true"
])
# 执行批量配置
run-batch
# 保存配置后重启Wildfly
reload

方式二:直接修改standalone.xml

找到你现有安全域的配置段,在login-modules下新增LDAP映射模块,注意要放在你现有Krb5LoginModule的后面:

<security-domain name="KerberosDomain" cache-type="default">
    <authentication>
        <!-- 你现有的Kerberos认证模块,保持不变 -->
        <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required">
            <!-- 你现有配置的参数,保持不变 -->
            <module-option name="useKeyTab" value="true"/>
            ...
        </login-module>
        <!-- 新增LDAP组映射模块 -->
        <login-module code="org.jboss.security.auth.spi.LdapGroupsMappingLoginModule" flag="optional" module="org.jboss.as.security">
            <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
            <module-option name="java.naming.provider.url" value="ldap://你的LDAP服务器地址:389"/>
            <module-option name="bindDN" value="cn=查询账号,ou=users,dc=你的域,dc=com"/>
            <module-option name="bindCredential" value="查询账号密码"/>
            <module-option name="baseCtxDN" value="ou=users,dc=你的域,dc=com"/>
            <module-option name="uidAttributeID" value="sAMAccountName"/>
            <module-option name="rolesCtxDN" value="ou=groups,dc=你的域,dc=com"/>
            <module-option name="roleAttributeID" value="member"/>
            <module-option name="roleNameAttributeID" value="cn"/>
            <module-option name="searchScope" value="SUBTREE_SCOPE"/>
            <module-option name="rolesAreRoles" value="true"/>
        </login-module>
    </authentication>
</security-domain>

验证配置

配置完成重启Wildfly后,你可以在代码中通过以下方式获取到映射后的角色:

// 获取当前登录用户的Principal
Principal userPrincipal = request.getUserPrincipal();
// 验证用户是否属于对应角色,这里的角色名就是你LDAP中对应用户组的cn值
boolean isInAdminGroup = request.isUserInRole("admin");

常见问题排查

  • 如果角色映射失败,先开启Wildfly安全日志debug级别,查看具体的LDAP查询请求和返回结果:
    在standalone.xml的日志配置段新增:
    <logger category="org.jboss.security">
        <level name="DEBUG"/>
    </logger>
    
  • 注意Kerberos认证返回的用户名格式,如果带上了域后缀(比如user@DOMAIN.COM),需要额外配置uidAttributeID的匹配规则,或者新增principalPrefix/principalSuffix参数去掉前缀后缀再匹配LDAP用户属性。

内容的提问来源于stack exchange,提问作者dkalna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:54:00