Как я могу переписать логин пользователей в нижний регистр? - PullRequest
0 голосов
/ 29 ноября 2011

Большая проблема заключается в том, что аутентификация LDAP в Windows нечувствительна к регистру, но программы, использующие эту функцию для аутентификации , чувствительны к регистру .Двумя такими программами являются Collabnet SubversionEdge и Adobe Version Cue.Любое изменение регистра имени пользователя приводит к другой записи пользователя в этих пакетах.И у этого пользователя не будет доступа, расстраивающего человека и засоряющего службу поддержки билетами.

Collabnet Subversion Edge использует Apache 2.2, поэтому я намерен перехватить URL-адрес и переписать имя пользователя для принудительной строчной буквы на сервере.side.

пример ввода:

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/

Обратите внимание, что остальная часть URL не изменилась.

Бонусный вопрос: Будет ли этот 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 клиентов

например.TortoiseSVN, AnhkSVN и клиент subserversion через командную строку.

Ответы [ 4 ]

1 голос
/ 06 июля 2015

Я знаю, что это старый вопрос, но я столкнулся с этой проблемой, связанной с Apache, Subversion и LDAP / Active Directory, и я считаю, что обходной путь может быть полезным.

Чтобы преобразовать имя входа в нижний регистр, достаточно переписать заголовок HTTP-запроса «Авторизация», в котором закодированы учетные данные пользователя. При базовой аутентификации этот заголовок имеет формат (см. https://en.wikipedia.org/wiki/Basic_access_authentication):

Authorization: Basic <base64_usr_pwd>

Где - это Base64-кодировка строки + ":" + .

Чтобы переписать этот заголовок, мы использовали модуль mod_perl, который обрабатывает фазу «анализатора заголовка», которая происходит до аутентификации, как описано в: https://perl.apache.org/docs/2.0/user/handlers/intro.html#mod_perl_Handlers_Categories.

Мы поместили следующую директиву mod_perl в раздел нашего репозитория SVN в файлах конфигурации Apache:

PerlHeaderParserHandler MyApache2::ConvertUsrToLowercase

Модуль Perl просто считывает логин и пароль, преобразует первый в нижний регистр, переписывает заголовок 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;

1 голос
/ 29 ноября 2011

Кусок пирога (слышите здесь иронию?): Пожалуйста, посмотрите, как RewriteMap может использовать внутренние функции (см. здесь ), здесь это функция 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]

Thisдолжно сработать.Я надеюсь, что дал вам достаточно подсказок, чтобы закончить работу;) Если у вас недостаточно подсказок ...

Два совета:


Пожалуйста, попробуйте использовать *Директива 1012 *: она помогает вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьтевыбрать ereg (POSIX) вместо preg (PCRE)!)

0 голосов
/ 10 октября 2017

Просто небольшое обновление к превосходному ответу David Gil del Rosal, которое обеспечивает идеальное решение для первоначально поставленной задачи.

Так как я не Perl парень, я сталкиваюсь с рядом проблем, пытаясь реализовать объясненное в ответе решение.

Вот список того, что я сделал, чтобы это заработало.

Мои настройки Ubuntu 16.04, Apache 2.4.18 и Perl 5.22

  1. Установить libapache2-mod-perl2
  2. Создать файл для размещения пользовательского обработчика

Модуль 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. Конфигурация обработчика

В моем случае это было /etc/apache2/mods-available/dav_svn.conf

<Location /xyz>
   DAV svn
   ...
   AuthzForceUsernameCase Lower
   PerlHeaderParserHandler MyApache2::ConvertUsrToLowercase
   ...
</Location>   
  1. Изменения в коде обработчика

Из-за некоторых ошибок компиляции пришлось добавить пару пакетов

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
0 голосов
/ 29 ноября 2011

LDAP не "чувствителен к регистру".Сравнение атрибутов и записей, выполняемых сервером каталогов, выполняется с использованием правил сопоставления , что полностью отличается от регистра без учета регистра.Отказ от использования правил сопоставления для сравнения приведет к неожиданным результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...