Apache auth_openidc匹配嵌套对象数组memberOf权限声明问题
解决mod_auth_openidc匹配嵌套对象数组声明的问题
问题分析
你尝试用Require claim memberOf.elements.object.string~(PRD_OPERATOR|PRD_SUPERVISOR|PRD_ADMINISTRATOR)做权限控制时失败,核心原因是Require claim语法对嵌套对象数组的支持有限,它更适合处理扁平数组或简单键值对,无法直接遍历数组中每个对象的object.string属性进行匹配。
解决方案
借助Apache的Require expr表达式语法,结合mod_auth_openidc提供的声明变量,实现对嵌套数组的遍历和匹配。以下是两种可行的配置方式:
方式一:数组遍历匹配(更精准)
直接提取数组中每个对象的string属性,检查是否包含目标组:
AuthType openid-connect # 验证用户已认证,且memberOf.elements中存在目标组 Require expr %{REMOTE_USER} != "" && (array_contains(array_map(lambda $x: $x.object.string, %{CLAIM_memberOf.elements}), "PRD_SUPERVISOR") || array_contains(array_map(lambda $x: $x.object.string, %{CLAIM_memberOf.elements}), "PRD_OPERATOR") || array_contains(array_map(lambda $x: $x.object.string, %{CLAIM_memberOf.elements}), "PRD_ADMINISTRATOR"))
方式二:JSON字符串正则匹配(更简洁)
将嵌套数组转为JSON字符串后,用正则匹配目标组:
AuthType openid-connect # 验证用户已认证,且JSON字符串中包含任一目标组 Require expr %{REMOTE_USER} != "" && preg_match('/PRD_(SUPERVISOR|OPERATOR|ADMINISTRATOR)/', json_encode(%{CLAIM_memberOf.elements}))
注意事项
- 确保Apache已加载
mod_auth_openidc和mod_ssl模块,你的2.4.10版本已支持表达式语法。 - 若不确定声明变量的名称,可开启调试日志确认:
日志中会输出所有解析后的OIDCDebugLog /var/log/httpd/oidc_debug.log OIDCDebug 3CLAIM_开头的变量,确认memberOf.elements对应的变量是否正确。
内容的提问来源于stack exchange,提问作者David Le Borgne
相关产品推荐
相关产品推荐

