Apache 作为反向代理的应用程序行为如下:
- 它需要基本身份验证标头才能登录。
- 对于从 开始的路径,
/api/*
只需要 Bearer 令牌。 - 如果标头中有基本令牌,应用程序将返回 401,即未授权的 http 响应 - 它只需要 Bearer 令牌。
除路径之外的所有 URL 都配置了 CAS 身份验证/api/*
,并且我在 vhost 配置文件中设置了基本身份验证令牌 - 让用户在通过 CAS 进行身份验证后无需再次显示登录表单即可登录。
Apache 配置文件enterprise-search.conf
:
<VirtualHost *:80>
ServerName https://search.test.xyz
ServerAdmin john@xyz
RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 10.10.10.2
LogFormat "%a %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\"" combined-forwarded
CustomLog ${APACHE_LOG_DIR}/enterprise-search-access.log combined-forwarded
ErrorLog ${APACHE_LOG_DIR}/enterprise-search-error.log
LogLevel debug
CASRootProxiedAs https://search.xyz
<Location />
# authn type
AuthType CAS
CASScope /
AuthName "KFUPM"
# authz
# Grant all groups access to the root
AuthGroupFile "/etc/apache2/http-authz/enterprise-search"
Require group all-enterpirse-search
# Pass REMOTE_USER header to application
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)$
RewriteRule . - [E=RU:%1,NS]
RequestHeader set REMOTE_USER %{RU}e
RequestHeader set Authorization "Basic xxxxxxxxxx"
</Location>
# authz: local_groups
<Location /all-enterpirse-search>
AuthGroupFile "/etc/apache2/http-authz/enterprise-search"
Require group all-enterprise-search all-enterpirse-search
</Location>
<Location /api/>
# authn type
AuthType none
Allow from all
Satisfy any
# authz
Require valid-user
# Pass REMOTE_USER header to application
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)$
RewriteRule . - [E=RU:%1,NS]
RequestHeader set REMOTE_USER %{RU}e
RequestHeader edit Authorization "Basic[^,]+, " ""
ProxyPass / http://localhost:3002/
ProxyPassReverse / http://localhost:3002/
</VirtualHost>
的行为RequestHeader edit Authorization "Basic[^,]+, " ""
是替换客户端传递的基本令牌头,并且它工作正常。
但我实际上想要的是 在 中设置基本令牌<Location />
并在 中将其删除<Location /api/>
。使用RequestHeader edit Authorization "Basic[^,]+, " ""
inside<Location /api/>
不会删除基本令牌,应用程序将返回带有 401 响应的 API 调用。
我对 Apache 配置还不熟悉,可能我实现目标的方法不正确。请提出更好的方法。
谢谢。