Apache,mod_auth_kerb,mod_proxy:在Go Web Application中获取经过身份验证的用户

时间:2015-05-10 14:13:31

标签: apache go mod-proxy mod-auth-kerb

我正在使用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应用程序中获取授权用户名?

4 个答案:

答案 0 :(得分:4)

对不起延迟 - 我参与了其他项目。非常感谢你的建议。切换到环境后,以下解决方案现在适用于我 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")

答案 1 :(得分:0)

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

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

然后,您可以通过r.Header.Get("HTTP_APP_USER")进行访问。

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

  

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

答案 2 :(得分:0)

尝试以下配置,然后您应该在标题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>

答案 3 :(得分:0)

不要使用重写解决方法,因为如果REMOTE_USER设置为mod_authn_ntlm(ntlm与本地计算机,请参阅https://support.microsoft.com/en-us/kb/896861)等模块,则会遇到执行阶段的问题。

template <template <typename...> class> struct tag{};

template <template <typename> class T>
void do_stuff() {
    do_stuff(tag<T>{});
}

void do_stuff(tag<A>) {
    std::cout << "A";
}

void do_stuff(tag<B>) {
    std::cout << "B";   
}

改为使用以下方法:

RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e