我有一个最初设置为内部网访问的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设置所覆盖。我做错了什么,我能做些什么来实现我的目标?它甚至可能吗?
答案 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可能映射到相同的文件系统位置,因此可以规避这种访问控制。
在您的情况下,这似乎不是问题,因为这看起来正是您正在寻找的行为。