[英]Apache, mod_auth_kerb, mod_proxy: Get authenticated user in Go Web Application
我将Apache用作反向代理,以进行go http服务器前的身份验证之类的操作。
以下apache kerberos设置只能解决一个问题。 我不知道如何在我的go应用程序中获取经过身份验证的用户名。
httpd.conf:
<VirtualHost host.domain.com:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
Order deny,allow
Allow from all
AuthType Kerberos
AuthName "User Admin"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
</Location>
</VirtualHost>
用
AuthType basic
我使用go函数从请求的Authorization标头中获取用户名
func (*Request) BasicAuth
但是与Authorization标头协商不可能。 此外,由于没有cgi环境,因此我无法使用REMOTE_USER环境变量。 我也尝试设置RequestHeader,但是没有成功。
是否有可能从go应用程序中获取授权的用户名?
抱歉耽搁了-我参与了其他项目。 非常感谢您的建议。 在切换到CentOS 7 / httpd 2.4环境后,以下解决方案现在对我有用:
<VirtualHost host.domain.com:80>
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
AuthType Kerberos
AuthName "Web Application"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
RequestHeader unset X-Forwarded-User
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1]
RequestHeader add X-Forwarded-User %{RU}e
</Location>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ServerName host.domain.com
</VirtualHost>
可通过以下方式在Go中访问用户:
user := req.Header.Get("X-Forwarded-User")
您应该可以通过SetEnvIf
- http : SetEnvIf
设置标题,如下所示:
SetEnvIf Authorization "(.*)" HTTP_APP_USER=$1
然后,您可以通过r.Header.Get("HTTP_APP_USER")
在Go中访问它。
要注意的是有没有保证客户没有还设置具有相同的标题: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers
在原始服务器上使用这些标头时要小心,因为如果原始请求中已经包含这些标头之一,则它们将包含多个(逗号分隔)值。 例如,您可以在原始服务器的日志格式字符串中使用%{X-Forwarded-For} i来记录原始客户端IP地址,但是如果请求通过多个代理,则可能会获得多个地址。
尝试以下配置,然后您应该在标题X-Forwarded-User
看到您的用户名。 确保已加载标头模块,例如a2enmod headers
:
<VirtualHost host.domain.com:80>
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
AuthType Kerberos
AuthName "User Admin"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
RequestHeader set X-Forwarded-User %{REMOTE_USER}s
</Location>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>
不要使用重写解决方法,因为如果将REMOTE_USER设置为mod_authn_ntlm之类的模块(本地计算机上的ntlm,请参见https://support.microsoft.com/zh-cn/kb/896861) ,将会在执行阶段遇到麻烦。 )。
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e
而是使用以下方法:
RequestHeader set X-Remote-User expr=%{REMOTE_USER}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.