1

我使用 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

但是使用授权标头协商这是不可能的。此外,我无法使用 REMOTE_USER 环境变量,因为没有 cgi 环境。我也尝试设置 RequestHeader 但没有任何成功。

是否有可能从 go 应用程序中获取授权的用户名?

4

4 回答 4

5

抱歉耽搁了——我参与了其他项目。非常感谢您的建议。在切换到环境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")
于 2015-11-26T14:16:25.283 回答
1

不要使用重写解决方法,因为如果 REMOTE_USER 设置为使用 mod_authn_ntlm 之类的模块(本地计算机的 ntlm,请参阅https://support.microsoft.com/en-us/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}
于 2016-07-28T08:08:50.570 回答
0

您应该能够通过SetEnvIf- http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif设置标题- 如下:

SetEnvIf Authorization "(.*)" HTTP_APP_USER=$1

然后你可以通过 Go 在 Go 中访问它r.Header.Get("HTTP_APP_USER")

请注意,不能保证客户端也没有设置相同的标头:http ://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers

在源服务器上使用这些标头时要小心,因为如果原始请求已经包含这些标头之一,它们将包含多个(逗号分隔)值。例如,您可以在源服务器的日志格式字符串中使用 %{X-Forwarded-For}i 来记录原始客户端 IP 地址,但如果请求经过多个代理,您可能会获得多个地址。

于 2015-05-10T14:49:09.247 回答
0

尝试以下配置,然后您应该会在标题中看到您的用户名X-Forwarded-User。确保加载了 headers 模块,例如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>
于 2015-10-29T19:21:24.047 回答