Chapter 5. Настройка

Table of Contents

Списки Контроля Доступа (ACLs)
Введение
Описание
Примеры
Сссылка
Управление Процессами
Введение
Пример процесса
Запись спроса
Утверждение менеджером
Обрабатывается отделом закупок
Обрабатывается почтовым отделом
Выполнение примера
Процесс (в качестве контейнера)
Диалоги Действий
Переходы
Действия Перехода
Деятельность
Схема процесса заказа книги
Эталонная последовательность настройки процесса
Процесс
Активность
ActivityDialog
Переход
Действия Перехода
Списки Контроля Доступа (ACLs)
Создание своих собственных тем (шаблонов)
Локализация интерфейса OTRS

Списки Контроля Доступа (ACLs)

Введение

Начиная с OTRS 2.0, Access Control Lists (ACLs) могут использоваться для управления доступом к заявкам, модулям, очередям и пр., или для влияния на действия по заявкам (закрытие, перемещение и т.д д.) в определенных ситуациях. ACL могут быть использованы в дополнение к существующей системе разрешений/прав Роли и Группы. С использованием ACL могут быть построены элементарные work-flows, основанные на атрибутах заявки.

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

ACL могут быть непосредственно вставлены в файл Kernel/Config.pm file, однако, теперь, мы не рекомендуем этот способ, так как в OTRS теперь существует специальный GUI Списки управления доступом ACL в панели администратора, позволяющий сохранять ACL в базе данных на первом шаге создания и, затем, синхронизировать их в файл, по готовности.

Этот раздел содержит ряд примеров ACL, который показывает процесс задания параметров ACL и краткое справочное руководство по наиболее важным параметрам ACL.

Warning

Пользователь по умолчанию 'root@localhost' не обрабатывается в Ticket ACls

Описание

Текст ACL состоит из двух больших разделов, 'Matching/Условия' и 'Change/Действия'. В разделе Условия указываются атрибуты которые проверяются на соответствие заданным образцам и при несовпадении, ACL не применяется. Раздел Действий, содержит правила, ограничивающие возможные опции заявки при выполнении заданных условий.

Разделы Условий

  • Properties

    Этот раздел содержит опции, которые могут меняться "на лету", например, при создании заявки, ее данные изменяются динамически по мере ввода информации, если ACL содержит проверку значения атрибута заявки, то только при совпадении введенного/выбранного значения с образцом в ACL, он может быть активирован и, возможно, повлиять на значения других атрибутов заявки, в противном случае, этого не произойдет.

  • PropertiesDatabase

    Этот раздел похож на 'Properties', но не может изменять данные заявки, не сохраненные в базе данных, это означает, что изменение атрибутов без ввода заявки в базу не будут иметь места. Не используется для экранов создания заявки (т.к. заявки еще нет в БД). То есть оперирует с данными ранее созданной заявки.

Раздел Действий

  • Possible

    Секция Possible сужает список доступных действий или значений до указанных в этой секции.

  • PossibleAdd

    Элементы в секции PossibleAdd добавляет пропущенные элементы, которые были ограничены другими ACL. PossibleAdd используется только вместе с другими ACL, в которых есть секции Possible или PossibleNot .

  • PossibleNot

    Эта секция используется для удаления отдельных элементов/значений из списка доступных в текущий момент. Она может использоваться самостоятельно или вместе с другими ACL с секциями Possible или PossibleAdd.

Чтобы сделать разработку ACL проще и более развитой, имеется набор, так называемых модификаторов для атрибутов в каждой секции. Эти модификаторы объяснены ниже:

Модификаторы

  • [Not]

    Он используется для исключения значения, например: '[Not]2 low' в данном случае речь идет о приоритетах заявки и будет иметь тот же результат, что и перечисление: '1 very low', '3 normal', '4 high', '5 very high'.

  • [RegExp]

    Служит для задания регулярного выражения для проверки соответствия нескольким значениям, например '[RegExp]low' для приоритетов будет аналогично списку '1 very low', '2 low'.

  • [regexp]

    Аналогично по действию с [RegExp] но нечувствителен к регистру символов.

  • [NotRegExp]

    Отрицательное регулярное выражение, например, '[NotRegExp]low' для списка приоритетов аналогично '3 normal', '4 high', '5 very high'.

  • [Notregexp]

    Аналогично [NotRegExp], но нечувствительно к регистру.

Примеры

Следующие примеры показывают оба способа представления ACL - в графическом и текстовом виде.

Example 5.1. Списки прав доступа (ACL) позволяют перемещать в очереди только заявки с приоритетом 5.

Этот пример показывает базовую структуру ACL. Во-первых, необходимо указать имя. В данном случае это "ACL-Name-2". Помните, что ACL будут численно отсортированы перед выполнением, т.е. используйте имена аккуратно.

Затем, следует секция "Properties", которая отфильтровывает ваши заявки. Все критерии, заданные здесь, применяются к заявке для определения должен ли ACL применяться для нее. В нашем примере, заявка проверяется на принадлежность к очереди "Raw" и наличии приоритета "5 very high". Это также зависит от изменений в форме ввода (т.е. если заявка в очереди "raw" и имеет приоритет "3 normal" - в этот момент соответствия нет, но, затем, при выборе поля Приоритет и из выпадающего списка выбирается "5 very high", то соответствие наступает).

Наконец, раздел "Возможные" определяет изменения экрана. В нашем случае из имеющихся очередей только очередь "Alert" может быть выбрана на странице Заявки.

# ticket acl
$Self->{TicketAcl}->{'100-Example-ACL'} = {
    # match properties
    Properties => {
        # current ticket match properties
        Ticket => {
            Queue => ['Raw'],
            Priority => ['5 very high'],
        }
    },
    # return possible options (white list)
    Possible => {
        # possible ticket options (white list)
        Ticket => {
            Queue => ['Alert'],
        },
    },
};
                


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

Этот пример очень похож на предыдущий, но в этом случае только заявки в очереди "Raw" и с приоритетом "5 very high", уже имеющиеся в базе данных будут соответствовать критерию. Такой тип ACL не учитывает изменения в формах изменения заявки, до того как заявка будет действительно обновлена в базе данных.

# ticket acl
$Self->{TicketAcl}->{'102-Example-ACL'} = {
    # match properties
    PropertiesDatabase => {
        # current ticket match properties
        Ticket => {
            Queue => ['Raw'],
            Priority => ['5 very high'],
        }
    },
    # return possible options (white list)
    Possible => {
        # possible ticket options (white list)
        Ticket => {
            Queue => ['Alert'],
        },
    },
};
                


Example 5.3.  Списки прав доступа (ACL) делают невозможным закрытие заявок в очереди raw и скрывают кнопку "закрыть".

Здесь вы можете увидеть как поле заявки (состояние), может проверяться на более чем возможное для ввода значение. Можно также ограничить возможные действия, выполняемые над конкретной заявкой. В этом случае, заявка не может быть закрыта.

$Self->{TicketAcl}->{'102-Second-Example-ACL'} = {
    # match properties
    Properties => {
        # current ticket match properties
        Ticket => {
            Queue => ['Raw'],
        }
    },
    # return possible options (white list)
    Possible => {
        # possible ticket options (white list)
        Ticket => {
            State => ['new', 'open', 'pending reminder'],
        },
    },
    3 return also not possible options (black list)
    PossibleNot => {
        # not possible action options
        Action => [ 'AgentTicketClose' ],
    },
};
                


Example 5.4. ACL удаляет навсегда возможность установить состояние "closed successful".

Этот пример показывает как можно использовать "негативные" фильтры (состояние "closed successful" будет удалено из списков выбора). Вы также можете видеть, что не заданные условия для "properties" для заявки будет означать, что оно верно для всех заявок, т.е. ACL применяется всегда. Это может быть полезно, если вы желаете скрыть определенные значения по умолчанию и допустить ввод других значений только в заданных обстоятельствах (например, если агент принадлежит определенной группе).

$Self->{TicketAcl}->{'103-Third-ACL-Example'} = {
    # match properties
    Properties => {
        # current ticket match properties (match always)
    },
    # return possible options
    PossibleNot => {
        # possible ticket options
        Ticket => {
            State => ['closed successful'],
        },
    },
};
                


Example 5.5.  ACL только отображает Hardware-сервисы для заявок, которые были созданы в очередях, начинающихся с "HW".

Этот пример также показывает как можно использовать регулярные выражения для сопоставления заявок и фильтрации доступных опций.

$Self->{TicketAcl}->{'104-Only-Hardware-Services-for-HW-Queues-ACL'} = {
    # match properties
    # note we don't have "Ticket => {" because there's no ticket yet
    Properties => {
    Queue => {
        Name => ['[RegExp]HW'],
        }
    },
    # return possible options
    Possible => {
        # possible ticket options
        Ticket => {
            Service => ['[RegExp]^(Hardware)'],
        },
    },
};
                


Example 5.6.  ACL для ограничения доступа к Процессу в интерфейсе клиента по CustomerID.

$Self->{TicketAcl}->{"105-Disallow-Process-For-CustomerID"} = {
    'Possible' => {},
    'PossibleNot' => {
        'Process' => [
            'P14'
        ]
    },
    'Properties' => {
        'CustomerUser' => {
            'UserCustomerID' => [
                'CustomerID'
            ]
        }
    },
    'PropertiesDatabase' => {},
    'StopAfterMatch' => 0
};
                


Сссылка

В нижеприведенном Сценарии представлен список всех параметров, которые могут быть использованы для списка прав доступа (ACLs).

Смотрите секция ACL в ProcessManagement документации для детального рассмотрения использования ACL для процессных заявок.

Example 5.7. Ссылка отображает все возможные важные настройки ACL

# ticket acl
$Self->{TicketAcl}->{'200-ACL-Reference'} = {
    # match properties (current values from the form)
    Properties => {

        # the used frontend module
        Frontend => {
            Action => ['AgentTicketPhone', 'AgentTicketEmail'],
        },

        # the logged in agent
        User => {
            UserLogin => ['some login'],
            Group_rw => [
                'hotline',
            ],
            Role => [
                'admin',
            ],
            # ...
        },

        # the logged in customer
        CustomerUser => {
            UserLogin => ['some login'],
            UserCustomerID => ['some customer id'],
            Group_rw => [
                'hotline',
            ],
            Role => [
                'admin',
            ],
            # ...
        },

        # process properties
        Process => {
            ProcessEntityID        => ['Process-9c378d7cc59f0fce4cee7bb9995ee3eb'],         # the Process that the current ticket is part of
            ActivityEntityID       => ['Activity-f8b2fdebe54eeb7b147a5f8e1da5e35c'],        # the current Activity of the ticket
            ActivityDialogEntityID => ['ActivityDialog-aff0ae05fe6803f38de8fff6cf33b7ce'],  # the current ActivityDialog that the Agent/Customer is using
        },

        # ticket properties
        Queue => {
            Name     => ['Raw'],
            QueueID  => ['some id'],
            GroupID  => ['some id'],
            Email    => ['some email'],
            RealName => ['OTRS System'],
            # ...
        },
        Service => {
            ServiceID => ['some id'],
            Name      => ['some name'],
            ParentID  => ['some id'],
            # ...
        },
        Type => {
            ID   => ['some id'],
            Name => ['some name'],
            # ...
        },
        Priority = {
            ID   => ['some id'],
            Name => ['some name'],
            # ...
        },
        SLA = {
            SLAID    => ['some id'],
            Name     => ['some name'],
            Calendar => ['some calendar'],
            # ...
        },
        State = {
            ID       => ['some id'],
            Name     => ['some name'],
            TypeName => ['some state type name'],,
            TypeID   => ['some state type id'],
            # ...
        },
        Owner => {
            UserLogin => ['some login'],
            Group_rw => [
                'some group',
            ],
            Role => [
                'admin',
            ],
            # ...
        },
        Responsible => {
            UserLogin => ['some login'],
            Group_rw => [
                'some group',
            ],
            Role => [
                'admin',
            ],
            # ...
        },
        DynamicField => {
            # Names must be in DynamicField_<field_name> format.
            # Values in [ ... ] must always be the untranslated internal data keys
            #   specified in the dynamic field definition and
            #   not the data values shown to the user.
            DynamicField_Field1          => ['some value'],
            DynamicField_OtherField      => ['some value'],
            DynamicField_TicketFreeText2 => ['some value'],
            # ...
        },
        # alternatively, ticket properties can be specified in the ticket hash
        Ticket => {
            Queue                => ['Raw'],
            State                => ['new', 'open'],
            Priority             => ['some priority'],
            Lock                 => ['lock'],
            CustomerID           => ['some id'],
            CustomerUserID       => ['some id'],
            Owner                => ['some owner'],
            DynamicField_Field1  => ['some value'],
            DynamicField_MyField => ['some value'],
            # ...
        },
    },

    # match properties (existing values from the database)
    PropertiesDatabase => {
        # See section "Properties", the same config can be used here.
        # ...
    }

    # reset possible options (white list)
    Possible => {
        # possible ticket options (white list)
        Ticket => {
            Queue => ['Hotline', 'Coordination'],
            State => ['some state'],
            Priority => ['5 very high'],
            DynamicField_Field1  => ['some value'],
            DynamicField_MyField => ['some value'],
            # ...
            NewOwner => ['some owner'],
            OldOwner => ['some owner'],
            # ...
        },

        # Limit the number of possible ActivityDialogs the Agent/Customer
        #   can use in a process ticket.
        ActivityDialog => ['AD1', 'AD3'],

        # Limit the number of possible Processes that can be started
        Process => ['Process-9c378d7cc59f0fce4cee7bb9995ee3eb', 'Process-12345678901234567890123456789012'],

        # possible action options (white list)
        Action => [
            'AgentTicketBounce',
            'AgentTicketPhone'.      # only used to show/hide the Split action
            'AgentLinkObject',       # only used to show/hide the Link action
            # ...
        ],
    },
    # add options (white list)
    PossibleAdd => {
        # See section "Possible"
        # ...
    },
    # remove options (black list)
    PossibleNot => {
        # See section "Possible"
        # ...
    },
};
                


Note

При проверке ACLs, если CustomerUserID параметр отправлен, механизм ACL сравнивает заданный ACL используя представленный CustomerUserID для сбора данных CustomerUser для заполнения CustomerUser hash, а также перекрывает информацию о клиенте в hash заявки для проверки в Properties. С другой стороны эти вычисления также используются в PropertiesDatabase разделе, но с использованием клиента заявки как основу для сбора данных.

Обратите внимание, что в Пользовательском Интерфейсе, CustomerUserID всегда отправляется с залогиненым Клиентом.

Помните, что на экранах поиска (AgentTicketSearch и CustomerTicketSearch) - единственно доступные атрибуты для ACL это динамические поля. Это означает, что для этих экранов вы не можете ограничить любые другие атрибуты, такие как Тип заявки, Состояние, Очередь и т.д.

From OTRS 4 the 'Action' parameter is not longer a hash but an array reference and it can be used in any of the Change sections using any of the Modifiers.