在mod_rewrite之前的Apache 2.x auth

时间:2011-01-31 20:16:22

标签: apache authentication mod-rewrite ldap

我有一个最初设置为内部网访问的apache服务器,所以我不必担心将其锁定。

稍后,我需要将它打开到互联网,所以我在httpd.conf的部分中添加了ldap身份验证指令,如下所示:

 Order allow,deny

 AuthBasicProvider ldap
 AuthType Basic
 AuthzLDAPAuthoritative on
 AuthName "MyCompany Intranet"
 AuthLDAPURL "ldap://myldapserver.mydomain.com:389/CN=Users,DC=mydomain,DC=com?sAMAccountName?sub?(memberOf=CN=Everyone at MyCompany,OU=MyCompany Groups,DC=mydomain,DC=com)" NONE
 AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
 AuthLDAPBindPassword "MyPassword"

 Require valid-user

 #Allow from all
 Allow from 192.168.1
 Allow from 10.254.0

 Satisfy any

这基本上使得本地用户无法使用密码进入,外部用户必须对我们的ADS域进行身份验证才能进入。

现在事情变得更复杂了。

我运行的应用程序通过在网址末尾添加cgi变量来区分用户,因此我在网站目录的根目录(/ var / www / html)中设置了一个.htaccess文件,如下所示:

RewriteEngine on
RewriteBase /
RewriteRule ^foo/(.*)$ some/really/long/url/$1?tenant_filter=2 [L]
RewriteRule ^bar/(.*)$ some/really/long/url/$1?tenant_filter=1 [L]

这非常棒。客户端键入http://myserver.mydomain.com/foo/file.html,URL会神奇地将其指向http://myserver.mydomain.com/some/really/long/url/file.html?tenant_filter=2虽然他们看到的只是http://myserver.mydomain.com/foo/file.html。

这就是问题所在。

我想为/ foo和/ bar虚拟目录定义单独的身份验证参数。无论我尝试什么,身份验证总是被我上面的http.conf中的ldap设置所覆盖。我做错了什么,我能做些什么来实现我的目标?它甚至可能吗?

2 个答案:

答案 0 :(得分:1)

此问题的解决方案是在/ var / www / html中创建名为foo和bar的目标目录。然后为/etc/httpd/conf.d目录中的目录设置身份验证,如下所示:

<Directory "/var/www/html/bar">    
    AuthBasicProvider ldap
    AuthType Basic
    AuthName "Bar Extranet"
    AuthLDAPURL ldap://myldapserver.mydomain.com:3268/DC=mydomain,DC=com?sAMAccountName?sub?(objectClass=*)
    AuthzLDAPAuthoritative on

    AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
    AuthLDAPBindPassword "mypassword"

    AuthLDAPGroupAttributeIsDN on

    require ldap-group CN=Bar Kiosk,OU=mycompany Groups,DC=mydomain,DC=com

    Allow from 192.168.1
    Allow from 10.254.0

    Satisfy any
</Directory>

重写的目标目录设置为接受来自foo或bar的身份验证,如下所示:

<Directory /var/www/html/some/really/long/directoryname>
   AuthBasicProvider ldap
   AuthType Basic
   AuthName "mycompany Extranet"
   AuthLDAPURL ldap://myldaphost.mydomain.com:3268/DC=mydomain,DC=com?sAMAccountName?sub?(objectClass=*)
   AuthzLDAPAuthoritative on

   AuthLDAPBindDN "CN=Administrator,CN=Users,DC=mydomain,DC=com"
   AuthLDAPBindPassword "mypassword"

   AuthLDAPGroupAttributeIsDN on

   require ldap-group CN=Domain Users,CN=Users,DC=mydomain,DC=com
   require ldap-group CN=BAR Kiosk,OU=mycompany Groups,CN=Users,DC=mydomain,DC=com

   Allow from 192.168.1
   Allow from 10.254.0

   satisfy any
</Directory>

虽然这允许foo和bar都访问目标目录,但它足以满足我的需要,因为目标目录被URL重写代码混淆。

我还更改了/etc/httpd/conf/httpd.conf文件中的代码以重写URL以防止循环:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)tenant_filter=1$ [OR]
RewriteCond %{REQUEST_URI} !^(.*)tenant_filter=2$
RewriteRule ^foo/(.*)$ some/really/long/url/$1?tenant_filter=2 [L]
RewriteRule ^bar/(.*)$ some/really/long/url/$1?tenant_filter=1 [L]

最后,由于我在该服务器上运行BlueDragon 7.1 for Linux,我的情况变得复杂。我在最初的帖子中没有提到它,但BD没有认识到我在Apache配置中做出的一些改变而没有重新启动。这使过程变得非常复杂。

答案 1 :(得分:0)

授权配置选项可以放在&lt; Location&gt;中。和&lt;目录&gt;部分。但是:

  

[...]&lt;位置&gt;不应使用指令来控制对文件系统位置的访问。由于几个不同的URL可能映射到相同的文件系统位置,因此可以规避这种访问控制。

在您的情况下,这似乎不是问题,因为这看起来正是您正在寻找的行为。