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

OpenLiberty SAML Web SSO 2.0组映射失效,403权限错误求助

OpenLiberty SAML Web SSO 2.0角色映射失效导致403禁止访问

问题概述

测试OpenLiberty的SAML Web Single Sign-On 2.0功能,身份认证环节正常,但角色/组映射功能失效,访问应用时出现403禁止访问错误。

相关配置

server.xml中的SAML配置

<samlWebSso20 id="defaultSP" nameIDFormat="email" userIdentifier="cn" groupIdentifier="memberOf" mapToUserRegistry="No" authFilterRef="myAuthFilter"/>

server.xml中的应用安全绑定配置

<application location="guide-getting-started.war" type="war" id="guide-getting-started.war" name="ctxrt-saml-test" contextRoot="ctxrt-saml-test">
            <application-bnd>
                    <security-role name="XXXX_admin_view">
                            <group name="XXXX_admin_view" />
      </security-role>
    </application-bnd>
  </application>

Web应用安全约束配置

<security-constraint>
      <web-resource-collection>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
      </web-resource-collection>
      <auth-constraint>
        <role-name>XXXX_admin_view</role-name>
      </auth-constraint>
    </security-constraint>

IdP返回的SAML响应片段

SAML2.0 Response
[...]
SAML 2.0 AttributeStatement
uid xxxxxxx
memberOf    CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr
cn  xxxxx

服务器日志信息

  1. 角色映射日志:
Added the following subject to role mapping for application: ctxrt-saml-test. 
group:[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr
  1. 授权失败日志:
CWWKS9104A: Authorization failed for user [user_cn] while invoking ctxrt-saml-test on /. The user is not granted access to any of the required roles: [XXXX_admin_view].

已尝试的配置(均未生效)

  • 将安全角色绑定的组名设为[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr
  • 将安全角色绑定的组名设为CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr
  • 将安全角色绑定的组名设为XXXX_admin_view

解决方案

方案1:正则提取组名(推荐)

修改server.xml中的samlWebSso20配置,添加groupFilter属性,用正则从memberOf的完整DN中提取目标组名:

<samlWebSso20 id="defaultSP" nameIDFormat="email" userIdentifier="cn" groupIdentifier="memberOf" 
              mapToUserRegistry="No" authFilterRef="myAuthFilter"
              groupFilter="CN=(.*?),.*"/>

该正则会匹配CN=后到第一个逗号的内容,正好提取出XXXX_admin_view,让SP端拿到的组名与角色绑定的组名完全一致。

方案2:完整匹配带Realm的组名

直接在application-bnd中使用日志里显示的完整组名(包含Realm前缀),注意替换[IdP-realmName]为日志中实际的Realm名称:

<application location="guide-getting-started.war" type="war" id="guide-getting-started.war" name="ctxrt-saml-test" contextRoot="ctxrt-saml-test">
            <application-bnd>
                    <security-role name="XXXX_admin_view">
                            <group name="[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr" />
      </security-role>
    </application-bnd>
  </application>

方案3:自定义角色映射文件

在应用的WEB-INF目录下创建application-roles.xml,手动映射SAML返回的完整组名到应用角色:

<application-roles xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="7.0">
    <security-role>
        <role-name>XXXX_admin_view</role-name>
        <group-principal name="[IdP-realmName]/CN=XXXX_admin_view,OU=XXXX,OU=Applications,OU=Groups,DC=[xxxx],DC=fr"/>
    </security-role>
</application-roles>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:53:20