![根据 mod_auth 表达式有条件地设置标头](https://linux22.com/image/779602/%E6%A0%B9%E6%8D%AE%20mod_auth%20%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%9C%B0%E8%AE%BE%E7%BD%AE%E6%A0%87%E5%A4%B4.png)
我有一个 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>