2015-01-17 2 views
0

У меня есть модуль Apache для разработчиков (PingFederate), который устанавливает переменные среды на основе полученного токена. Я хотел бы контролировать доступ к каталогам на основе значения переменной окружения.Apache ACL на основе значения переменной среды

Например, модуль устанавливает переменные, как это: [PF_AUTH_SUBJECT] => Aaron [PF_AUTH_GROUPS] => CN = Application.E18.Users, OU = Внутренние, DC = локальная, CN = Application.E17.Users, OU = Internal, DC = local

Я хочу защитить каталог, чтобы к нему могли обращаться только пользователи из группы CN = Application.E18 .... Мое направление местоположения conf выглядит следующим образом:

<Location /example_app> 
    SetEnvIf %{PF_AUTH_GROUPS} ^.*CN=Application.E18.Users.*$ ALLOWED 
    AuthName "ACL PingFederate restricted" 
    AuthType PFApacheAgent 
    Order Deny,Allow 
    Deny from all 
    Allow from all 
</Location> 

Это не работает. Я пробовал:

SetEnvIf %{PF_AUTH_GROUPS} ^.*CN=Application.E18.Users.*$ ALLOWED 
SetEnvIf %{PF_AUTH_GROUPS} ^.*Application.*$ ALLOWED 
SetEnvIf %{PF_AUTH_GROUPS} ^.*A.*$ ALLOWED 

Единственное, что работает это:

SetEnvIf %{PF_AUTH_GROUPS} ^.*$ ALLOWED 

Это, очевидно, не будет работать.

https://issues.apache.org/bugzilla/show_bug.cgi?id=25725 несколько указывает, что SetEnvIf не будет проверять переменные среды, но документы в http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html упоминают «переменную среды в списке тех, которые связаны с запросом», что и должно быть.

Я также попытался mod_rewrite использовать это:

RewriteEngine On 
<Location /example_app> 
    RewriteCond %{PF_AUTH_GROUPS} ^.*Application.E18.Users.*$ 
    RewriteRule - [E=ALLOWED:1] 
    AuthName "ACL PingFederate restricted" 
    AuthType PFApacheAgent 
    Order Deny,Allow 
    Deny from all 
    Allow from all 
</Location> 

Во всех этих случаях РАЗРЕШЕНЫ переменная окружения не установлена.

ответ

2

Вам нужно сделать mod_rewrite выполнять 2 раза, чтобы иметь возможность использовать заголовки, произведенные mod_pf, так как последняя выполняется после бывшего:

RewriteEngine On 
RewriteCond %{ENV:REDIRECT_PASS} !1 
RewriteRule .* $1 [L,E=PASS:1] 

RewriteCond %{HTTP:PF_AUTH_GROUPS} !^.*ECN.*$ 
RewriteRule .* $1 [L,R=401] 

Это также задокументированы здесь: https://ping.force.com/Support/PingIdentityArticle?id=kA340000000Gs7bCAC

Смежные вопросы