更大的问题是Windows中的LDAP身份验证不区分大小写,但使用此功能进行身份验证的程序区分大小写。两个这样的程序是Collabnet SubversionEdge和Adobe Version Cue。用户名大小写的任何变化都会导致这些包中的另一个用户条目。而且这个用户将无法访问,使人感到沮丧,并且在门票上堵塞了帮助台。
Collabnet Subversion Edge使用Apache 2.2,所以我打算截取url并重写用户名以在服务器端强制执行小写。
示例输入:
https://User:password@svn.domain.com
https://USER@svn.domain.com
svn://useR:password@svn.domain.com/Repo/Trunk/BIN/
svn://svn.domain.com/Repo/Trunk/BIN/
所需的重写:
https://user:password@svn.domain.com
https://user@svn.domain.com
svn://user:password@svn.domain.com/Repo/Trunk/BIN/
svn://svn.domain.com/Repo/Trunk/BIN/
请注意,网址的其余部分未更改。
奖金问题: 这个ReWriteRule会处理Collabnet Edge的所有情况吗?
与服务器通信的其他方式是:
1)通过基于浏览器的管理控制台:
<form action='/csvn/j_spring_security_check' method='POST' id='loginForm'>
<input type='text' class='text_' name='j_username' id='j_username' value='' />
<input type='password' class='text_' name='j_password' id='j_password' />
<input type='submit' value='Login' class="Button"/>
</form>
2)svn clients
例如。通过命令行提供TortoiseSVN,AnhkSVN和subserversion客户端。
答案 0 :(得分:1)
小蛋糕(在这里听到讽刺?):请查看RewriteMap如何使用内部函数(参见here),这里是tolower
函数:
RewriteEngine On
RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} ([a-zA-Z0-9]+):([a-zA-Z0-9]+)@svn.domain.com(.*) [OR]
RewriteCond %{REQUEST_URI} svn.domain.com/(.+)
RewriteRule (.*) ${lc:$1} [R=301,L]
这应该有效。 我希望我已经给你足够的线索来完成这项工作;) 如果你没有足够的线索......
请尝试使用RewriteLog
指令:它可以帮助您找出此类问题:
# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On
我最喜欢检查regexp的工具:
http://www.quanetic.com/Regex(别忘了选择ereg(POSIX)而不是preg(PCRE)!)
答案 1 :(得分:1)
我知道这是一个老问题,但我想出了与此相关的问题 Apache,Subversion和LDAP / Active Directory,我相信解决方法可能会有所帮助。
要将登录名转换为小写,只需重写用户凭据编码的“授权”HTTP请求标头即可。使用基本身份验证时,此标头具有格式(请参阅https://en.wikipedia.org/wiki/Basic_access_authentication):
Authorization: Basic <base64_usr_pwd>
其中&lt; base64_usr_pwd&gt;是字符串&lt; login&gt; +“:”+&lt; password&gt;的Base64编码。
要重写此标头,我们使用了一个mod_perl模块来处理在身份验证之前发生的“标头解析器”阶段,如:https://perl.apache.org/docs/2.0/user/handlers/intro.html#mod_perl_Handlers_Categories中所述。
我们在&lt; Location&gt;中添加了以下mod_perl指令我们在Apache配置文件中的SVN存储库部分:
PerlHeaderParserHandler MyApache2::ConvertUsrToLowercase
Perl模块只读取登录名和密码,将前者转换为小写,用转换后的登录名重写“Authorization”HTTP请求头并返回OK:
package MyApache2::ConvertUsrToLowercase; use strict; use APR::Base64; use Apache2::RequestRec; use Apache2::Const -compile => qw(OK DECLINED); sub handler { my $request = shift; my ($res, $passwd) = $request->get_basic_auth_pw; # get passwd my $user = lc $request->user; # get lowercase login my $auth_header = APR::Base64::encode("$user:$passwd"); # rewrite header & return OK $request->headers_in->{'Authorization'} = "Basic $auth_header"; return Apache2::Const::OK; } 1;
答案 2 :(得分:0)
LDAP不是“不区分大小写”。目录服务器执行的属性和条目的比较是使用matching rules执行的,这与不区分大小写完全不同。未能使用匹配规则进行比较将导致意外结果。
答案 3 :(得分:0)
对优秀David Gil del Rosal
的答案稍作更新,为原先提出的问题提供了完美的解决方案。
由于我不是Perl
人,因此在尝试实施解答解决方案时遇到了许多问题。
以下是我为使其发挥作用所做的事情清单。
我的设置Ubuntu 16.04
,Apache 2.4.18
和Perl 5.22
libapache2-mod-perl2
Apache2 mod_perl模块(libapache2-mod-perl2
)希望在以下某个位置找到自定义代码
/etc/perl
/usr/local/lib/x86_64-linux-gnu/perl/5.22.1
/usr/local/share/perl/5.22.1
/usr/lib/x86_64-linux-gnu/perl5/5.22
/usr/share/perl5
/usr/lib/x86_64-linux-gnu/perl/5.22
/usr/share/perl/5.22
/usr/local/lib/site_perl
/etc/apache2
我选择/etc/perl
,这可能不是最佳位置,但这就是我使用的。
在示例包MyApache2::ConvertUsrToLowercase
中使用,我选择的位置已翻译为/etc/perl/MyApache2/ConvertUsrToLowercase.pm
文件
就我而言,它是/etc/apache2/mods-available/dav_svn.conf
<Location /xyz>
DAV svn
...
AuthzForceUsernameCase Lower
PerlHeaderParserHandler MyApache2::ConvertUsrToLowercase
...
</Location>
由于某些编译错误必须添加几个包
use APR::Table;
use Apache2::Access;
最终代码
# /etc/perl/MyApache2/ConvertUsrToLowercase.pm
package MyApache2::ConvertUsrToLowercase;
use strict;
use APR::Base64;
use APR::Table;
use Apache2::RequestRec;
use Apache2::Access;
use Apache2::Const -compile => qw(OK DECLINED);
sub handler {
my $request = shift;
my $header = "Authorization";
my ($res, $passwd) = $request->get_basic_auth_pw; # get passwd
my $user = lc $request->user; # get lowercase login
my $auth_header = APR::Base64::encode("$user:$passwd");
# rewrite header & return OK
$request->headers_in->{'Authorization'} = "Basic $auth_header";
return Apache2::Const::OK;
}
1;
/var/log/apache2/error.log