Использование внешних хранилищ данных

Данные клиентов
Пользовательский бэк-енд
База Данных (По умолчанию)
Клиент с несколькими идентификаторами (Заявки Компании)
LDAP
Клиент с несколькими идентификаторами (Заявки Компании)
Использование больше чем одного пользовательского хранилища данных с OTRS
Сохранение информации о клиенте в динамических полях
Хранилища (бэк-енды) для аутентификации Агентов и Клиентов
Хранилища данных (бэк-енды) для аутентификации Агентов
База Данных (DB, по умаолчанию)
LDAP
HTTPBasicAuth-аутентификация для Агентов
Radius
Хранилища информации для аутентификации (проверки подлинности) клиентов
База Данных (По умолчанию)
LDAP
HTTPBasicAuth аутентификация для клиентов
Radius
Настройка самостоятельной регистрации клиента
Настройка веб-интерфейса
Отображения клиентов
Настройка таблицы customer_user в Базе Данных OTRS DB

Данные клиентов

OTRS работает с различными атрибутами данных клиентов, такими как имя пользователя, адрес электронной почты, номер телефона и т.д. Эти атрибуты отображаются в обеих фронтэндах, для Агентов и Клиентов. Они также используются для проверки подлинности клиентов.

Данные клиентов, которые используются и отображаются в OTRS очень легко настраиваются. Несмотря на это следующая информация будет всегда необходима для проверки подлинности клиента:

  • Вход пользователей

  • Адресс электронной почты

  • ID Клиента

Используйте следующие параметры SysConfig, если желаете отобразить информацию о клиенте в интерфейсе агента.

    # Ticket::Frontend::CustomerInfo*
    # (show customer info on Compose (Phone and Email), Zoom and
    # Queue view)
    $Self->{'Ticket::Frontend::CustomerInfoCompose'} = 1;
    $Self->{'Ticket::Frontend::CustomerInfoZoom'} = 1;

Скрипт: Параметры конфигурации SysConfig.

Пользовательский бэк-енд

Вы можете использоваь два типа хранилища информации клиентов: Базу Данных DB и LDAP. Если у вас уже есть другой бэк-енд для хранения пользовательской информации (например SAP), также есть возможность написать модуль для использования этой функции.

База Данных (По умолчанию)

В Примере 11-1 приведена конфигурация базы данных, которая использует данные клиента, хранящиеся в базе данных OTRS.

Example 4.6. Настройка клиентского хранилища базы данных (DB)

# CustomerUser (customer database backend and settings)
$Self->{CustomerUser} = {
    Name => 'Database Datasource',
    Module => 'Kernel::System::CustomerUser::DB',
    Params => {
        # if you want to use an external database, add the required settings
#            DSN => 'DBI:odbc:yourdsn',
#            Type => 'mssql', # only for ODBC connections
#            DSN => 'DBI:mysql:database=customerdb;host=customerdbhost',
#            User => '',
#            Password => '',
            Table => 'customer_user',

            # CaseSensitive will control if the SQL statements need LOWER()
            #   function calls to work case insensitively. Setting this to
            #   1 will improve performance dramatically on large databases.
            CaseSensitive => 0,
        },
# customer unique id
CustomerKey => 'login',

# customer #
CustomerID => 'customer_id',
CustomerValid => 'valid_id',
    CustomerUserListFields => ['first_name', 'last_name', 'email'],
    CustomerUserSearchFields => ['login', 'last_name', 'customer_id'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 250,
    CustomerUserPostMasterSearchFields => ['email'],
    CustomerUserNameFields => ['title','first_name','last_name'],
    CustomerUserEmailUniqCheck => 1,
#    # show not own tickets in customer panel, CompanyTickets
#    CustomerUserExcludePrimaryCustomerID => 0,
#    # generate auto logins
#    AutoLoginCreation => 0,
#    AutoLoginCreationPrefix => 'auto',
#    # admin can change customer preferences
#    AdminSetPreferences => 1,
#    # cache time to live in sec. - cache any database queries
#    CacheTTL => 0,
#    # just a read only source
#    ReadOnly => 1,
    Map => [
        # note: Login, Email and CustomerID needed!
        # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target
        [ 'UserTitle',      'Title',      'title',      1, 0, 'var', '', 0 ],
        [ 'UserFirstname',  'Firstname',  'first_name', 1, 1, 'var', '', 0 ],
        [ 'UserLastname',   'Lastname',   'last_name',  1, 1, 'var', '', 0 ],
        [ 'UserLogin',      'Username',   'login',      1, 1, 'var', '', 0 ],
        [ 'UserPassword',   'Password',   'pw',         0, 0, 'var', '', 0 ],
        [ 'UserEmail',      'Email',      'email',      1, 1, 'var', '', 0 ],

#        [ 'UserEmail',      'Email', 'email',           1, 1, 'var', '[% Env("CGIHandle") %]?Action=AgentTicketCompose&ResponseID=1&TicketID=[% Data.TicketID %]&ArticleID=[% Data.ArticleID %]', 0 ],
        [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var', '', 0 ],

#        [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ],
        [ 'UserPhone',        'Phone',       'phone',        1, 0, 'var', '', 0 ],
        [ 'UserFax',          'Fax',         'fax',          1, 0, 'var', '', 0 ],
        [ 'UserMobile',       'Mobile',      'mobile',       1, 0, 'var', '', 0 ],
        [ 'UserStreet',       'Street',      'street',       1, 0, 'var', '', 0 ],
        [ 'UserZip',          'Zip',         'zip',          1, 0, 'var', '', 0 ],
        [ 'UserCity',         'City',        'city',         1, 0, 'var', '', 0 ],
        [ 'UserCountry',      'Country',     'country',      1, 0, 'var', '', 0 ],
        [ 'UserComment',      'Comment',     'comments',     1, 0, 'var', '', 0 ],
        [ 'ValidID',          'Valid',       'valid_id',     0, 1, 'int', '', 0 ],
    ],
    # default selections
    Selections => {
        UserTitle => {
            'Mr.' => 'Mr.',
            'Mrs.' => 'Mrs.',
        },
    },
};


Если нужно настроить данные клиентов, измените заголовки столбцов или добавьте новые к таблице customer_user базы данных OTRS. В качестве примера используйте нижеприведенный сценарий, в котором показано как добавить новое поле для номера комнаты.

linux:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 116 to server version: 5.0.18-Debian_7-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use otrs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> ALTER TABLE customer_user ADD room VARCHAR (250);
Query OK, 1 rows affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> quit
Bye
linux:~#

Сценарий: Добавление поля "комната" в таблицу customer_user table.

Теперь добавьте новый столбец в MAP-масив в Kernel/Config.pm, как это показано в нижеприведенном сценарии.

    # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
    [...]
    [ 'UserRoom',      'Room',      'room',       0, 1, 'var', '', 0 ],

Сценарий: Добавление поля "комната" в файл Kernel/Config.pm file.

Всю эту информацию о клиенте можно также отредактировать воспользовавшись ссылкой Клиенты в интерфейсе агента.

Клиент с несколькими идентификаторами (Заявки Компании)

Одному клиенту можно назначить больше одного клиентского идентификатора (Customer ID). Это может быть полезно, если клиенту необходимо получить доступ к заявкам других клиентов, например, руководитель хочет посмотреть заявки своих помощников. Если клиент может получить доступ к заявкам другого клиента, то используется особенность OTRS "заявки компании". Заявки компании могут быть доступны перейдя по ссылке "Заявки Компании" в клиентской панели управления.

Для использованя заявок компании, новый столбец с идентификатором (IDs), который должен быть доступен для клиента, должен быть добавлен в таблицу customer_user базы данных OTRS (см. Сценарий ниже).

linux:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 124 to server version: 5.0.18-Debian_7-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use otrs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> ALTER TABLE customer_user ADD customer_ids VARCHAR (250);
Query OK, 1 rows affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> quit
Bye
linux:~#

Сценарий: Добавление поля customer_ids в таблицу customer_user.

Теперь новый столбец должен быть добавлен в MAP-массив в Kernel/Config.pm, как это показано в нижеприведенном Сценарии.

    # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
    [...]
    [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ],

Сценарий: Добавление поля UserCustomerIDs в Kernel/Config.pm

Теперь, новый столбец для мульти-идентификатора ( IDs) клиента можно редактировать с помощью веб-интерфейса Агента, в разделе управления клиентами.

Для того, чтобы убедится что один клиент имеет доступ к заявкам других клиентов нужно добавить идентификаторы (IDs) этих пользователей в новое поле для нескольких идентификаторов клиента. Каждый идентификатор (ID) должен быть отделен точкой с запятой (см. ниже Пример 11-2).

Example 4.7. Хранение Заявок Компании в базе данных DB

Клиенты А, Б и Ц созданы в вашей системе и А хочет иметь доступ к заявкам Б и Ц используя клиентскую панель. Б и Ц не должны иметь доступа к заявкам других пользователей.

Для реализации этой структуры, измените таблицу customer_user и маппинг (преобразование) в Kernel/Config.pm как это показано выше. С помощью Панели Администрирования или используя ссылку Клиенты в веб-интерфейсе Агента загрузите настройки пользователя А. Если настройки отображаются, добавьте значения "Б;Ц;" в поле для CustomerIDs.


LDAP

Если у вас есть LDAP­-каталог, в котором хранятся данные о клиентах, его можно использовать в OTRS, в качестве хранилища данных о клиентах, как это показано в Примере 11-3.

Example 4.8. Настройка LDAP в качестве клиентского бэк-енда

# CustomerUser
# (customer ldap backend and settings)
$Self->{CustomerUser} = {
    Name => 'LDAP Data Source',
    Module => 'Kernel::System::CustomerUser::LDAP',
    Params => {
        # ldap host
        Host => 'bay.csuhayward.edu',
        # ldap base dn
        BaseDN => 'ou=seas,o=csuh',
        # search scope (one|sub)
        SSCOPE => 'sub',
        # The following is valid but would only be necessary if the
        # anonymous user does NOT have permission to read from the LDAP tree
        UserDN => '',
        UserPw => '',
        # in case you want to add always one filter to each ldap query, use
        # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
        AlwaysFilter => '',
            # if the charset of your ldap server is iso-8859-1, use this:
#            SourceCharset => 'iso-8859-1',

            # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
            Params => {
                port => 389,
                timeout => 120,
                async => 0,
                version => 3,
            },
    },
    # customer unique id
    CustomerKey => 'uid',
    # customer #
    CustomerID => 'mail',
    CustomerUserListFields => ['cn', 'mail'],
    CustomerUserSearchFields => ['uid', 'cn', 'mail'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 250,
    CustomerUserPostMasterSearchFields => ['mail'],
    CustomerUserNameFields => ['givenname', 'sn'],
    # show not own tickets in customer panel, CompanyTickets
    CustomerUserExcludePrimaryCustomerID => 0,
    # add an ldap filter for valid users (expert setting)
#    CustomerUserValidFilter => '(!(description=locked))',
    # administrator can't change customer preferences
    AdminSetPreferences => 0,
#    # cache time to live in sec. - cache any database queries
#    CacheTTL => 0,
    Map => [
        # note: Login, Email and CustomerID are mandatory!
        # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
        [ 'UserTitle',      'Title',      'title',           1, 0, 'var', '', 0 ],
        [ 'UserFirstname',  'Firstname',  'givenname',       1, 1, 'var', '', 0 ],
        [ 'UserLastname',   'Lastname',   'sn',              1, 1, 'var', '', 0 ],
        [ 'UserLogin',      'Username',   'uid',             1, 1, 'var', '', 0 ],
        [ 'UserEmail',      'Email',      'mail',            1, 1, 'var', '', 0 ],
        [ 'UserCustomerID', 'CustomerID', 'mail',            0, 1, 'var', '', 0 ],
#        [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ],
        [ 'UserPhone',      'Phone',      'telephonenumber', 1, 0, 'var', '', 0 ],
        [ 'UserAddress',    'Address',    'postaladdress',   1, 0, 'var', '', 0 ],
        [ 'UserComment',    'Comment',    'description',     1, 0, 'var', '', 0 ],
    ],
};


Если дополнительные атрибуты клиента хранятся в LDAP-каталоге, например, имя руководителя, номер мобильного телефона, или отдела, и если эту информацию нужно отобразить в OTRS, просто расширьте MAP-массив в файле Kernel/Config.pm записями для этих атрибутов, как показано в нижеприведенном сценарии.

    # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
    [...]
    [ 'UserPhone',      'Phone',      'telephonenumber', 1, 0, 'var', '', 0 ],

Сценарий: Добавление нового поля в файл Kernel/Config.pm.

Клиент с несколькими идентификаторами (Заявки Компании)

При использовании LDAP-бэкэнда клиенту можно присвоить больше одного клиентского айди (Customer ID). Для использования заявок компании, в LDAP-директорию нужно добавить новое поле, которое содержит доступные агенту идентификаторы (IDs).

Если в LDAP-каталоге было созадно новое поле, его также нужно добавить в MAP-массив в Kernel/Config.pm, как это показано в нижеприведенном сценарии.

    # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
    [...]
    [ 'UserCustomerIDs', 'CustomerIDs', 'customer_ids', 1, 0, 'var', '', 0 ],

Сценарий: Подстановка новых полей в Kernel/Config.pm file.

Клиентские идентификаторы (IDs) можно редактировать напрямую в LDAP-директории. OTRS может только считать информацию из LDAP, но не записывать.

Чтобы убедтися что клиент имеет доступ к заявкам других клиентов, добавьте идентификаторы (IDs) клиентов, к заявкам которых нужен доступ, к новому полю вашей LDAP-директории. Каждый идентификатор ID должен быть отделен точнкой с запятой (см. ниже Рисунок 11-4).

Example 4.9. Использование заявок Компании с LDAP-бэкэндом

Клиенты А, Б и Ц созданны в вашей системе и А хочет иметь доступ к заявкам Б и Ц через панель клиента. Б и Ц не должны иметь доступа к другим пользователям.

Для реализации этой установки измените LDAP-директорию и маппинг (mapping) в Kernel/Config.pm, как это показано выше. Затем добавьте в вашей LDAP-директории значения "Б;Ц;" в поле для CustomerIDs, для клиента "А".


Использование больше чем одного пользовательского хранилища данных с OTRS

Если в OTRS нужно использовать больше одного источника данных о клиентах (например LDAP и базу данных), конфигурационный параметр CustomerUser должен быть расширен числом, например "CustomerUser1", "CustomerUser2" (см. ниже Пример 11-5).

Example 4.10. Использование больше чем одного пользовательского хранилища данных с OTRS

В следующем примере показано применение конфигурации как для LDAP так и для базы данных клиентского бэкэнда с OTRS.

# 1. Customer user backend: DB
# (customer database backend and settings)
$Self->{CustomerUser1} = {
    Name => 'Customer Database',
    Module => 'Kernel::System::CustomerUser::DB',
    Params => {
        # if you want to use an external database, add the
        # required settings
#        DSN => 'DBI:odbc:yourdsn',
#        Type => 'mssql', # only for ODBC connections
#        DSN => 'DBI:mysql:database=customerdb;host=customerdbhost',
#        User => '',
#        Password => '',
        Table => 'customer_user',
    },
    # customer unique id
    CustomerKey => 'login',
    # customer #
    CustomerID => 'customer_id',
    CustomerValid => 'valid_id',
    CustomerUserListFields => ['first_name', 'last_name', 'email'],
    CustomerUserSearchFields => ['login', 'last_name', 'customer_id'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 250,
    CustomerUserPostMasterSearchFields => ['email'],
    CustomerUserNameFields => ['title','first_name','last_name'],
    CustomerUserEmailUniqCheck => 1,
#    # show not own tickets in customer panel, CompanyTickets
#    CustomerUserExcludePrimaryCustomerID => 0,
#    # generate auto logins
#    AutoLoginCreation => 0,
#    AutoLoginCreationPrefix => 'auto',
#    # admin can change customer preferences
#    AdminSetPreferences => 1,
#    # cache time to live in sec. - cache any database queries
#    CacheTTL => 0,
#    # just a read only source
#    ReadOnly => 1,
    Map => [

        # note: Login, Email and CustomerID needed!
        # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target
        [ 'UserTitle',      'Title',      'title',        1, 0, 'var', '', 0 ],
        [ 'UserFirstname',  'Firstname',  'first_name',   1, 1, 'var', '', 0 ],
        [ 'UserLastname',   'Lastname',   'last_name',    1, 1, 'var', '', 0 ],
        [ 'UserLogin',      'Username',   'login',        1, 1, 'var', '', 0 ],
        [ 'UserPassword',   'Password',   'pw',           0, 0, 'var', '', 0 ],
        [ 'UserEmail',      'Email',      'email',        1, 1, 'var', '', 0 ],
        [ 'UserCustomerID', 'CustomerID', 'customer_id',  0, 1, 'var', '', 0 ],
        [ 'UserPhone',      'Phone',      'phone',        1, 0, 'var', '', 0 ],
        [ 'UserFax',        'Fax',        'fax',          1, 0, 'var', '', 0 ],
        [ 'UserMobile',     'Mobile',     'mobile',       1, 0, 'var', '', 0 ],
        [ 'UserStreet',     'Street',     'street',       1, 0, 'var', '', 0 ],
        [ 'UserZip',        'Zip',        'zip',          1, 0, 'var', '', 0 ],
        [ 'UserCity',       'City',       'city',         1, 0, 'var', '', 0 ],
        [ 'UserCountry',    'Country',    'country',      1, 0, 'var', '', 0 ],
        [ 'UserComment',    'Comment',    'comments',     1, 0, 'var', '', 0 ],
        [ 'ValidID',        'Valid',      'valid_id',     0, 1, 'int', '', 0 ],
    ],
    # default selections
    Selections => {
        UserTitle => {
            'Mr.' => 'Mr.',
            'Mrs.' => 'Mrs.',
        },
    },
};

# 2. Customer user backend: LDAP
# (customer ldap backend and settings)
$Self->{CustomerUser2} = {
    Name => 'LDAP Datasource',
    Module => 'Kernel::System::CustomerUser::LDAP',
    Params => {
        # ldap host
        Host => 'bay.csuhayward.edu',
        # ldap base dn
        BaseDN => 'ou=seas,o=csuh',
        # search scope (one|sub)
        SSCOPE => 'sub',
        # The following is valid but would only be necessary if the
        # anonymous user does NOT have permission to read from the LDAP tree
        UserDN => '',
        UserPw => '',
        # in case you want to add always one filter to each ldap query, use
        # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
        AlwaysFilter => '',
        # if the charset of your ldap server is iso-8859-1, use this:
#        SourceCharset => 'iso-8859-1',

        # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
        Params => {
            port => 389,
            timeout => 120,
            async => 0,
            version => 3,
        },
    },
    # customer unique id
    CustomerKey => 'uid',
    # customer #
    CustomerID => 'mail',
    CustomerUserListFields => ['cn', 'mail'],
    CustomerUserSearchFields => ['uid', 'cn', 'mail'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 250,
    CustomerUserPostMasterSearchFields => ['mail'],
    CustomerUserNameFields => ['givenname', 'sn'],
    # show not own tickets in customer panel, CompanyTickets
    CustomerUserExcludePrimaryCustomerID => 0,
    # add a ldap filter for valid users (expert setting)
#    CustomerUserValidFilter => '(!(description=locked))',
    # admin can't change customer preferences
    AdminSetPreferences => 0,
    Map => [
        # note: Login, Email and CustomerID needed!
        # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
        [ 'UserTitle',      'Title',      'title',           1, 0, 'var', '', 0 ],
        [ 'UserFirstname',  'Firstname',  'givenname',       1, 1, 'var', '', 0 ],
        [ 'UserLastname',   'Lastname',   'sn',              1, 1, 'var', '', 0 ],
        [ 'UserLogin',      'Username',   'uid',             1, 1, 'var', '', 0 ],
        [ 'UserEmail',      'Email',      'mail',            1, 1, 'var', '', 0 ],
        [ 'UserCustomerID', 'CustomerID', 'mail',            0, 1, 'var', '', 0 ],
#        [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ],
        [ 'UserPhone',      'Phone',      'telephonenumber', 1, 0, 'var', '', 0 ],
        [ 'UserAddress',    'Address',    'postaladdress',   1, 0, 'var', '', 0 ],
        [ 'UserComment',    'Comment',    'description',     1, 0, 'var', '', 0 ],
    ],
};


Есть возможность интегрировать до 10 различных пользовательских бэк-эндов. Используйте интерфейс управления клиентами в OTRS, чтобы просматривать и редактировать данные о них (при условии наличия прав для записи).

Сохранение информации о клиенте в динамических полях

Иногда бывает полезным также сохранить данные клиента заявки непосредственно в динамических полях заявки, для создания некоторых отчетов по этим данным. Например, по заявкам компании, когда клиент в течение отчетного периода перешел в другую компанию того же провайдера услуг техподдержки.

Динамические поля заполняются при создании заявки или когда клиент заявки изменяется. Значения полей берутся из данных клиента. Это работает для всех бэкендов, но наиболее полезно для LDAP-бэкендов.

Для включения этой опции OTRS, активируйте параметр "Ticket::EventModulePost###930-DynamicFieldFromCustomerUser" и "DynamicFieldFromCustomerUser::Mapping". Последний параметр содержит настройку, какие поля данных клиента должны сохраняться в каждом из динамических полей. Поля должны быть заранее созданы в системе и включены в AgentTicketFreeText, так чтобы они были доступны для ручного заполнения. Они должны быть недоступны для ввода в AgentTicketPhone, AgentTicketEmail и AgentTicketCustomer, во избежание перекрытия автоматическии установленных значений.

Хранилища (бэк-енды) для аутентификации Агентов и Клиентов

OTRS предлагает опцию для проверки подлинности агентов и клиентов с использованием различных хранилищ данных (бэкендов).

Хранилища данных (бэк-енды) для аутентификации Агентов

База Данных (DB, по умаолчанию)

В качестве бэк-энда для аутентификации агентов в OTRS, по умолчанию, используется база данных. Чтобы добавлять агентов, редактировать данные о них, перейдите на страницу Панель Администрирования и нажмите ссылку Интерфейс для управления агентами (см. ниже Пример 11.6).

Example 4.11. Проверка подлинности агентов путем использования Базы Данных (DB) в качестве хранилища информации.

    $Self->{'AuthModule'} = 'Kernel::System::Auth::DB';


LDAP

Если данные всех ваших агентов хранятся в LDAP-директории, то для аутентификации пользователей в OTRS можно использовать LDAP-модуль (см. ниже Пример 11-7). Этот модуль имеет права только на чтение дерева LDAP-каталогов, что означает что нету возможности редактировать данные пользователей используя ссылку веб-интерфейс для управления пользователями .

Example 4.12. Проверка подлинности агентов при использовании LDAP в качестве хранилища данных

# This is an example configuration for an LDAP auth. backend.
# (Make sure Net::LDAP is installed!)
$Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
$Self->{'AuthModule::LDAP::Host'} = 'ldap.example.com';
$Self->{'AuthModule::LDAP::BaseDN'} = 'dc=example,dc=com';
$Self->{'AuthModule::LDAP::UID'} = 'uid';

# Check if the user is allowed to auth in a posixGroup
# (e. g. user needs to be in a group xyz to use otrs)
$Self->{'AuthModule::LDAP::GroupDN'} = 'cn=otrsallow,ou=posixGroups,dc=example,dc=com';
$Self->{'AuthModule::LDAP::AccessAttr'} = 'memberUid';
# for ldap posixGroups objectclass (just uid)
#  $Self->{'AuthModule::LDAP::UserAttr'} = 'UID';
# for non ldap posixGroups objectclass (with full user dn)
#  $Self->{'AuthModule::LDAP::UserAttr'} = 'DN';

# The following is valid but would only be necessary if the
# anonymous user do NOT have permission to read from the LDAP tree
$Self->{'AuthModule::LDAP::SearchUserDN'} = '';
$Self->{'AuthModule::LDAP::SearchUserPw'} = '';

# in case you want to add always one filter to each ldap query, use
# this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
$Self->{'AuthModule::LDAP::AlwaysFilter'} = '';

# in case you want to add a suffix to each login name, then
# you can use this option. e. g. user just want to use user but
# in your ldap directory exists user@domain.
#    $Self->{'AuthModule::LDAP::UserSuffix'} = '@domain.com';

# Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
$Self->{'AuthModule::LDAP::Params'} = {
    port => 389,
    timeout => 120,
    async => 0,
    version => 3,
};


Параметры конфигурации приведенные в сценарии приведенном ниже могут быть использованы для синхронизации пользовательских данных из LDAP-каталога в локальную базу данных OTRS. Это уменьшает количество запросов к LDAP-серверу и ускоряет проверку подлинности в OTRS. Синхронизация данных завершена, когда агент аутентифицируется впервые. Несмотря на то, что данные могут быть синхронизированны в локальной базе данных OTRS, LDAP-каталог является последней инстанцией для проверки подлинности пользователей, таким образом пользователи, не активные для дерева каталогов LDAP не могут пройти аутентификацию в OTRS, даже в том случае, когда данные о пользователе уже хранятся в базе данных OTRS. Данные агентов в LDAP-директории не могут быть отредактированы с помощью веб-интерфейса OTRS, так что управление данными должно осуществлятся непосредственно в дереве каталогов LDAP.

# defines AuthSyncBackend (AuthSyncModule) for AuthModule
# if this key exists and is empty, there won't be a sync.
# example values: AuthSyncBackend, AuthSyncBackend2
$Self->{'AuthModule::UseSyncBackend'} = 'AuthSyncBackend';

# agent data sync against ldap
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = 'ldap://ldap.example.com/';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=otrs, dc=org';
$Self->{'AuthSyncModule::LDAP::UID'} = 'uid';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=sys, ou=user, dc=otrs, dc=org';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'some_pass';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
    # DB -> LDAP
    UserFirstname => 'givenName',
    UserLastname  => 'sn',
    UserEmail     => 'mail',
};
[...]

# AuthSyncModule::LDAP::UserSyncInitialGroups
# (sync following group with rw permission after initial create of first agent
# login)
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
    'users',
];

Сценарий: Синхронизация пользовательских данных из LDAP-директориив базу данных OTRS.

Кроме того вы можете использовать группы LDAP для определения принадлежности к группам и ролям в OTRS. Для дополнительной информации и примеров смотрите файл Kernel/Config/Defaults.pm. Вот пример синхронизации LDAP с группами OTRS.

# Attributes needed for group syncs
# (attribute name for group value key)
$Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'memberUid';
# (select the attribute for type of group content UID/DN for full ldap name)
# $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'UID';
# $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN';

AuthSyncModule::LDAP::UserSyncGroupsDefinition
# (If "LDAP" was selected for AuthModule and you want to sync LDAP
# groups to otrs groups, define the following.)
$Self->{'AuthSyncModule::LDAP::UserSyncGroupsDefinition'} = {
    # your ldap group
    'cn=agent,o=otrs' => {
        # otrs group(s)
        'admin' => {
            # permission
            rw => 1,
            ro => 1,
        },
        'faq' => {
            rw => 0,
            ro => 1,
        },
    },
    'cn=agent2,o=otrs' => {
        'users' => {
            rw => 1,
            ro => 1,
        },
    }
};
    

HTTPBasicAuth-аутентификация для Агентов

Если вы хотите реализовать решение "single sign on" для всех агентов, вы можете использовать базовую аунентификацию (для всех систем) и HTTPBasicAuth-модуль для OTRS (см. ниже Пример 11-8).

Example 4.13. Аутентификация Агентов с помощью HTTPBasic

# This is an example configuration for an apache ($ENV{REMOTE_USER})
# auth. backend. Use it if you want to have a singe login through
# apache http-basic-auth
$Self->{'AuthModule'} = 'Kernel::System::Auth::HTTPBasicAuth';

# Note:
#
# If you use this module, you should use as fallback
# the following configuration settings if the user is not authorized
# apache ($ENV{REMOTE_USER})
$Self->{LoginURL} = 'http://host.example.com/not-authorised-for-otrs.html';
$Self->{LogoutURL} = 'http://host.example.com/thanks-for-using-otrs.html';


Radius

Параметры конфигурации приведенные в Примере 11-9 могут быть использованы для аутентификации агентов с использованием Radius-сервера.

Example 4.14. Аутентификация (проверка подлинности) агентов с использованием Radius-сервера в качестве хранилища информации

# This is example configuration to auth. agents against a radius server
$Self->{'AuthModule'} = 'Kernel::System::Auth::Radius';
$Self->{'AuthModule::Radius::Host'} = 'radiushost';
$Self->{'AuthModule::Radius::Password'} = 'radiussecret';


Хранилища информации для аутентификации (проверки подлинности) клиентов

База Данных (По умолчанию)

Для аутентификации клиентов в OTRS, по умолчанию, используется база данных. Используя базу данных в качестве хранилища, все данные клиентов можно редактировать через веб-интерфейс OTRS (см. ниже Пример 11-10).

Example 4.15. Аутентификация Клиента в Базе Данных

# This is the auth. module against the otrs db
$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB';
$Self->{'Customer::AuthModule::DB::Table'} = 'customer_user';
$Self->{'Customer::AuthModule::DB::CustomerKey'} = 'login';
$Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'pw';
#$Self->{'Customer::AuthModule::DB::DSN'} = "DBI:mysql:database=customerdb;host=customerdbhost";
#$Self->{'Customer::AuthModule::DB::User'} = "some_user";
#$Self->{'Customer::AuthModule::DB::Password'} = "some_password";


LDAP

Если у вас есть LDAP-каталог со всеми данными о клиентах, можно использовать модуль LDAP для аутентификации клиентов в OTRS (см. Пример 11-11 ниже). Поскольку этот модуль имеет права только для чтения для данных из LDAP-бэкенда, то нету возможности изменить данные клиента через веб.

Example 4.16. Аутентификация пользователей с помощью LDAP-бэкэнда

# This is an example configuration for an LDAP auth. backend.
# (make sure Net::LDAP is installed!)
$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';
$Self->{'Customer::AuthModule::LDAP::Host'} = 'ldap.example.com';
$Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'dc=example,dc=com';
$Self->{'Customer::AuthModule::LDAP::UID'} = 'uid';

# Check if the user is allowed to auth in a posixGroup
# (e. g. user needs to be in a group xyz to use otrs)
$Self->{'Customer::AuthModule::LDAP::GroupDN'} = 'cn=otrsallow,ou=posixGroups,dc=example,dc=com';
$Self->{'Customer::AuthModule::LDAP::AccessAttr'} = 'memberUid';
# for ldap posixGroups objectclass (just uid)
$Self->{'Customer::AuthModule::LDAP::UserAttr'} = 'UID';
# for non ldap posixGroups objectclass (full user dn)
#$Self->{'Customer::AuthModule::LDAP::UserAttr'} = 'DN';

# The following is valid but would only be necessary if the
# anonymous user does NOT have permission to read from the LDAP tree
$Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = '';
$Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = '';

# in case you want to add always one filter to each ldap query, use
# this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
$Self->{'Customer::AuthModule::LDAP::AlwaysFilter'} = '';

# in case you want to add a suffix to each customer login name, then
# you can use this option. e. g. user just want to use user but
# in your ldap directory exists user@domain.
#$Self->{'Customer::AuthModule::LDAP::UserSuffix'} = '@domain.com';

# Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
$Self->{'Customer::AuthModule::LDAP::Params'} = {
    port => 389,
    timeout => 120,
    async => 0,
    version => 3,
};


HTTPBasicAuth аутентификация для клиентов

Если для пользователей нужно внедрить "single sign on"-решение, можно использовать базовую, HTTPBasic аутентификацию (для всех систем) и использовать модуль HTTPBasicAuth с OTRS (больше не нужно логинится в OTRS). См. ниже Пример 11-12.

Example 4.17. Аутентификация клиентов с помощью HTTPBasic

# This is an example configuration for an apache ($ENV{REMOTE_USER})
# auth. backend. Use it if you want to have a singe login through
# apache http-basic-auth
$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::HTTPBasicAuth';

# Note:
# If you use this module, you should use the following
# config settings as fallback, if user isn't login through
# apache ($ENV{REMOTE_USER})
$Self->{CustomerPanelLoginURL} = 'http://host.example.com/not-authorised-for-otrs.html';
$Self->{CustomerPanelLogoutURL} = 'http://host.example.com/thanks-for-using-otrs.html';


Radius

Настройки приведенные в примере 11-13 могут быть использованы для аутентификации ваших клиентов с помощью Radius-сервера.

Example 4.18. Аутентификация клиентов с использованием Radius

# This is a example configuration to auth. customer against a radius server
$Self->{'Customer::AuthModule'} = 'Kernel::System::Auth::Radius';
$Self->{'Customer::AuthModule::Radius::Host'} = 'radiushost';
$Self->{'Customer::AuthModule::Radius::Password'} = 'radiussecret';


Настройка самостоятельной регистрации клиента

Есть возможность настроить самостоятельную регистрацию новых клиентов, доступную через панель customer.pl. Можно добавить новые дополнительные или обязательные поля, такие как номер комнаты, адрес или состояние.

В следующем примере показано каким образом можно указать обязательные для заполнения поля в базе данных клиентов, в данном случае, для хранения номера клиента.

Настройка веб-интерфейса

Для отображения нового поля для номера комнаты в веб-интерфейсе пользователя (customer.pl), нужно внести изменения в .dtl-файл, который отвечает за шаблон этого интерфейса. Отредактируйте файл Kernel/Output/HTML/Standard/CustomerLogin.dtl добавив новые поля после строки 80 (см. нижеприведенный сценарий).

[...]
<div class="NewLine">
    <label for="Room">[% Translate("Room{CustomerUser}") | html %]</label>
    <input title="[% Translate("Room Number") | html %]" name="Room" type="text" id="UserRoom" maxlength="50" />
</div>
[...]

Сценарий: Отображение новых полей в веб-интерфейсе.

Отображения клиентов

На следующем этапе, нужно внести изменения в маппинг (mapping), рассширив его новым элементом - номером комнаты. Чтобы убедится что изменения не потеряются после обновления, установите настройкы "CustomerUser" из файла Kernel/Config/Defaults.pm в файл Kernel/Config.pm. Теперь измените MAP-массив, добавив новое поле - номер комнаты, как это показано в нижеприведенном сценарии.

# CustomerUser
# (customer database backend and settings)
$Self->{CustomerUser} = {
    Name => 'Database Backend',
    Module => 'Kernel::System::CustomerUser::DB',
    Params => {
        # if you want to use an external database, add the
        # required settings
#        DSN => 'DBI:odbc:yourdsn',
#        Type => 'mssql', # only for ODBC connections
#        DSN => 'DBI:mysql:database=customerdb;host=customerdbhost',
#        User => '',
#        Password => '',
        Table => 'customer_user',
    },
    # customer unique id
    CustomerKey => 'login',
    # customer #
    CustomerID => 'customer_id',
    CustomerValid => 'valid_id',
    CustomerUserListFields => ['first_name', 'last_name', 'email'],
#    CustomerUserListFields => ['login', 'first_name', 'last_name', 'customer_id', 'email'],
    CustomerUserSearchFields => ['login', 'last_name', 'customer_id'],
    CustomerUserSearchPrefix => '',
    CustomerUserSearchSuffix => '*',
    CustomerUserSearchListLimit => 250,
    CustomerUserPostMasterSearchFields => ['email'],
    CustomerUserNameFields => ['title', 'first_name', 'last_name'],
    CustomerUserEmailUniqCheck => 1,
#    # show not own tickets in customer panel, CompanyTickets
#    CustomerUserExcludePrimaryCustomerID => 0,
#    # generate auto logins
#    AutoLoginCreation => 0,
#    AutoLoginCreationPrefix => 'auto',
#    # admin can change customer preferences
#    AdminSetPreferences => 1,
#    # cache time to live in sec. - cache database queries
#    CacheTTL => 0,
#    # just a read only source
#    ReadOnly => 1,
    Map => [

        # note: Login, Email and CustomerID needed!
        # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target
        [ 'UserTitle',      'Title',      'title',       1, 0, 'var', '', 0 ],
        [ 'UserFirstname',  'Firstname',  'first_name',  1, 1, 'var', '', 0 ],
        [ 'UserLastname',   'Lastname',   'last_name',   1, 1, 'var', '', 0 ],
        [ 'UserLogin',      'Username',   'login',       1, 1, 'var', '', 0 ],
        [ 'UserPassword',   'Password',   'pw',          0, 0, 'var', '', 0 ],
        [ 'UserEmail',      'Email',      'email',       1, 1, 'var', '', 0 ],
        [ 'UserCustomerID', 'CustomerID', 'customer_id', 0, 1, 'var', '', 0 ],
        [ 'UserPhone',      'Phone',      'phone',       1, 0, 'var', '', 0 ],
        [ 'UserFax',        'Fax',        'fax',         1, 0, 'var', '', 0 ],
        [ 'UserMobile',     'Mobile',     'mobile',      1, 0, 'var', '', 0 ],
        [ 'UserRoom',       'Room',       'room',        1, 0, 'var', '', 0 ],
        [ 'UserStreet',     'Street',     'street',      1, 0, 'var', '', 0 ],
        [ 'UserZip',        'Zip',        'zip',         1, 0, 'var', '', 0 ],
        [ 'UserCity',       'City',       'city',        1, 0, 'var', '', 0 ],
        [ 'UserCountry',    'Country',    'country',     1, 0, 'var', '', 0 ],
        [ 'UserComment',    'Comment',    'comments',    1, 0, 'var', '', 0 ],
        [ 'ValidID',        'Valid',      'valid_id',    0, 1, 'int', '', 0 ],
    ],
    # default selections
    Selections => {
        UserTitle => {
            'Mr.' => 'Mr.',
            'Mrs.' => 'Mrs.',
        },
    },
};

Сценарий: Внесение изменений в map-массив.

Настройка таблицы customer_user в Базе Данных OTRS DB

Последним шагом является добавление нового столбца с номером комнаты в таблицу customer_user базы данных OTRS (см. нижеприведенный сценарий). В этой колонке будет хранится информация для номера комнаты.

linux:~# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 5.0.18-Debian_7-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use otrs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> ALTER TABLE customer_user ADD room VARCHAR (200);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> quit
Bye
linux:~#

Сценарий: Добавление новой колонки в таблицу customer_user.

Теперь новое поле для номера комнаты должно отображатся в панели информации о клиенте и экранах управления клиентами. Когда новые клиенты будут регистрировать аккаунт, им нужно будет вписать номер комнаты. Если для работы OTRS используется Microsoft IIS, то чтобы новые изменения вступили в силу в Config.pm нужно перезапустить веб-сервер.