Table of Contents
Начиная с OTRS 2.0, Access Control Lists (ACLs) могут использоваться для управления доступом к заявкам, модулям, очередям и пр., или для влияния на действия по заявкам (закрытие, перемещение и т.д д.) в определенных ситуациях. ACL могут быть использованы в дополнение к существующей системе разрешений/прав Роли и Группы. С использованием ACL могут быть построены элементарные work-flows, основанные на атрибутах заявки.
В основном, ACL используются для ограничения возможных действий над заявками, основанные на заданном наборе правил.
ACL могут быть непосредственно вставлены в файл
Kernel/Config.pm
file, однако, теперь, мы не
рекомендуем этот способ, так как в OTRS теперь существует специальный GUI
Списки управления доступом ACL в
панели администратора, позволяющий сохранять ACL в базе данных на первом
шаге создания и, затем, синхронизировать их в файл, по готовности.
Этот раздел содержит ряд примеров ACL, который показывает процесс задания параметров ACL и краткое справочное руководство по наиболее важным параметрам ACL.
Пользователь по умолчанию '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" # ... }, };
При проверке 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.