2015-05-10 1 views
1

Я использую Apache как обратный прокси-сервер для таких вещей, как аутентификация перед http-сервером go.Apache, mod_auth_kerb, mod_proxy: Получить аутентифицированного пользователя в Go Web Application

Следующие установки apache kerberos работают с одной проблемой. Я не знаю, как получить аутентифицированное имя пользователя в моем приложении.

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 

Я получаю имя пользователя из заголовка Authorization в запрос с помощью функции идут

func (*Request) BasicAuth 

но с заголовком Authorization переговоры это невозможно. Кроме того, я не могу использовать переменную среды REMOTE_USER, поскольку среда cgi отсутствует. Я также попытался установить RequestHeader, но без каких-либо успехов.

Есть ли возможность получить авторизованное имя пользователя из приложения go?

ответ

3

Извините за задержку - Я принимал участие в других проектах. Большое спасибо за предложения. Следующее решение теперь работает для меня после переключения на окружающую среду 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") 
0

Вы должны быть в состоянии установить заголовок через SetEnvIf - http://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

Будьте осторожны при использовании этих заголовков на исходном сервере, так как они содержат больше, чем один (запятая), если исходный запрос уже содержит один из этих заголовков. Например, вы можете использовать% {X-Forwarded-For} i в строке формата журнала исходного сервера для регистрации IP-адреса первоначальных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси.

+0

Спасибо за ответ! К сожалению, единственные записи заголовков, которые я могу видеть в моем приложении Go, следующие: Значение даты: [Пн, 11 мая 2015 г. 09:42:55 GMT] Значение Www-Authenticate: [Negotiate] Значение Vary: [Accept-Encoding ] Значение Content-Type: [text/html; charset = iso-8859-1] Является ли положение строки SetEnvIf в разделе сечением imortant? Я пробовал разные позиции, но безуспешно. –

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> 
0

НЕ использовать переписывания обходной путь, потому что у вас возникнут проблемы с этапами выполнения, если 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} 
Смежные вопросы