2015-01-17 74 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