1

go http サーバーの前での認証などのリバース プロキシとして Apache を使用しています。

次の apache kerberos セットアップは、1 つの問題で動作します。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

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 に答える
0

以下のように、 httpSetEnvIf ://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif 経由でヘッダーを設定できるはずです。

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

その後、Go 経由でアクセスできますr.Header.Get("HTTP_APP_USER")

クライアントが同じヘッダーを設定しいないという保証はないことに注意してください: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers

元のリクエストにすでにこれらのヘッダーの 1 つが含まれている場合、これらのヘッダーには複数の (カンマ区切りの) 値が含まれるため、オリジン サーバーでこれらのヘッダーを使用する場合は注意してください。たとえば、元のサーバーのログ形式文字列で %{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 に答える