2015-01-17 114 views
0

我有一個供應商Apache模塊(PingFederate),它根據它接收到的令牌設置環境變量。我想根據環境變量的值控制對目錄的訪問。基於環境變量值的Apache ACL

例如模塊將變量是這樣的: [PF_AUTH_SUBJECT] =>亞倫 [PF_AUTH_GROUPS] => CN = Application.E18.Users,OU =內部,DC =本地,CN = Application.E17.Users, OU =內部,DC =本地

我想保護一個目錄,以便只有組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