如何将登录用户重写为小写?

时间:2011-11-28 22:11:07

标签: apache mod-rewrite ldap

更大的问题是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客户端。

4 个答案:

答案 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.04Apache 2.4.18Perl 5.22

  1. 安装libapache2-mod-perl2
  2. 创建文件以托管自定义处理程序
  3. 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文件

    1. 处理程序配置
    2. 就我而言,它是/etc/apache2/mods-available/dav_svn.conf

      <Location /xyz>
         DAV svn
         ...
         AuthzForceUsernameCase Lower
         PerlHeaderParserHandler MyApache2::ConvertUsrToLowercase
         ...
      </Location>   
      
      1. 对处理程序代码的更改
      2. 由于某些编译错误必须添加几个包

        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;
        
        1. 通过查看apache2错误日志文件/var/log/apache2/error.log
        2. 完成所有疑难解答