在AJP将请求代理到tomcat之前,是否有一种方法可以将REMOTE_USER设置为某些URL的特定值?
我有一个面向SSO(Apache / mod_shib)的tomcat应用程序。某些URL仍需要公开访问。我有shibboleth用于受保护的部分,但是公共部分仍然需要用户名(无法更改应用程序的工作方式)。
我可以正确识别需要公共访问的URL,并为它们关闭shibboleth身份验证。当我这样做时,现在没有用户定义,因此系统拒绝让我进入。
我思考我想做的是这个:
IF URL matches pattern:
turn off shibboleth
force set REMOTE_USER="anonymous" //and maybe AJP_REMOTE_USER, too?!
我尝试使用FakeBasicAuth来实现最后一位,但是在代理发生后,似乎已设置了用户。有没有办法做到这一点?也许有更好的方法?
一种不太理想的替代方法是将tomcat应用程序配置为使用REMOTE_USER之外的其他方法,然后尝试使用mod_rewrite设置该值。我不想这样做,因为这样用户名将不会显示在tomcat访问日志中。
操作REMOTE_USER env变量非常困难,如果您在连接的一开始就具有额外的约束要执行此操作,则可以尝试mod_security
。
不幸的是,为mod_security
编写规则并不是世界上最简单的事情。
示例在通过身份验证后使用REMOTE_USER变量的内容填充标头X-Remote-User并将标头发送到后端代理(Apache 2.4.6)。
# Example for Apache 2.4.6
<VirtualHost *:80>
RewriteEngine on
<Location />
###############################################
# Your authentication logic here
AuthType .......
AuthName .......
AuthBasicProvider .......
.... etc
Require valid-user
###############################################
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e
</Location>
ProxyTimeout 300
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/
</VirtualHost>