我有一个 apache 2.4 充当应用程序的反向代理。我需要根据 mod_auth 表达式有条件地为代理设置标头。特别是我使用 mod_auth_openidc,我需要根据 OIDC 角色应用标头,但我不知道如何在 If 语句中使用它。
举个例子,这是可以正常工作的:
<Location "/app">
Require claim roles:app_reader
RequestHeader set Authorization "Basic ${READER_TOKEN}"
</Location>
但是,我需要做这样的事情:
<Location "/app">
<If "-n %{claim roles:app_admin}">
RequestHeader set Authorization "Basic ${ADMIN_TOKEN}"
</If>
<ElseIf "-n %{claim roles:app_reader}">
RequestHeader set Authorization "Basic ${READER_TOKEN}"
</ElseIf>
</Location>
最新的不起作用,因为我不确定如何实际引用 mod_auth 表达式。请注意,这很可能不是我的插件所特有的,如果你替换claim roles:app_admin
为,valid-user
我猜情况是一样的。
但是,具体到我的模块,它正在使用我需要的信息设置环境变量和标头 ( OIDC_CLAIM_roles
)。但它们似乎无法在 上访问Location
,req()
也resp()
找不到它们。
关于哪种方法正确,有什么建议吗?
答案1
我找到了解决方案,感谢模块创建者
Apache 中的 If 部分在身份验证之前进行评估,因此这是不可能的。但是,mod_auth_openidc 允许通过执行以下操作来做到这一点:
<Location "/app">
RequestHeader set Authorization "Basic ${READER_TOKEN}" expr=reqenv('OIDC_CLAIM_roles')=~/app_reader/
RequestHeader set Authorization "Basic ${ADMIN_TOKEN}" expr=reqenv('OIDC_CLAIM_roles')=~/app_admin/
</Location>