如何将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
相关产品推荐
相关产品推荐

