RU/Access Control List

From Multi Theft Auto: Wiki
Jump to: navigation, search

MTA включает в себя полноценный Access Control List (ACL, список контроля доступа), позволяющий вам обезопашивать и ограничивать доступ к серверу, его функциям и ресурсам любыми способами, которыми вы пожелаете.

Ключевая концепция MTA'шного ACL (и ACL в целом) - то, что вы даете определенному объекту набор прав. В случае с MTA, объекты - это одно из двух: либо ресурсы, либо пользователи. В MTA доступно множество прав - они в основном сфокусированы на скриптинговых функциях серверной стороны.

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

Конечно, большая сила влечет за собой большую ответственность, и очень легко можно сломать ресурсы полностью - например, отключение spawnPlayer для всех ресурсов будет ОЧЕНЬ плохой идеей. В то же время, есть ситуации, когда вам может захотеться это сделать - если вы хотите принудить все свои ресурсы использовать ресурс spawn manager, например, но даже это несколько драконовские меры.

Понимание ACL

ACL состоит из двух важных компонентов: групп и ACL-списков. Они фигурируют как узлы <group name=""> и <acl name="" />. Их назначение:
1. Предоставить пользователям полномочия контролировать сервер и пользоваться командами ресура. Примеры:

  • Позволить только админам использовать функцию giveweapon мода freeroam
  • Позволить всем пользователям запускать ресурс

2. Предоставить ресурсам полномочия использовать функции скриптинга и функции других ресурсов. Примеры:

  • Позволить ресурсу использовать функцию restartResource
  • Позволить ресурсу использовать функцию call для использования экспортированных из другого скрипта функций

Группы по умолчанию

MTA предоставляет некоторые группы по умолчанию, в списке они по возрастанию полномочий. Эти группы:

  • Everyone
  • Moderator
  • SuperModerator
  • Admin
  • Console - Эта контролирует полномочия людей, которые используют консоль, через <object name="user.Console" />
  • RPC - Remote Procedure Call (Удаленный Вызов Процедуры). Конкретно эта предоставляет доступ только к callRemote и отключает команды ресурсов по умолчанию. Для подробностей смотрите саму функцию.


Для дальнейших объяснений, я воспользуюсь группой Everyone в качестве образца. По умолчанию это выглядит так:

    <group name="Everyone">
        <acl name="Default" />
        <object name="user.*" />
        <object name="resource.*" />
    </group>


Сначала вы заметите имя ACL-списка внутри группы. Он обозначает, какие у группы полномочия. Пользователи и ресурсы, принадлежные данной группе, будут иметь полномочия, указанные в acl-списке с названием "Default". Заметка: Вы увидите, что эта группа - особенная, в нее входит любой пользователь и ресурс, это благодаря использованию шаблона (*) на месте, где должно быть название пользователя или ресурса.

Теперь прокрутите далее вниз ACL'а и вы увидите acl-список <acl name="Default" />. Заметьте, что я значительно обрезал данный список из-за его длины.

    <acl name="Default">
        <right name="command.start" access="false" />
        <right name="command.stop" access="false" />
        <right name="command.stopall" access="false" />
        ...и т.д. и т.д...
        <right name="function.executeCommandHandler" access="false" />
        <right name="function.setPlayerMuted" access="false" />
        <right name="function.restartResource" access="false" />
        ...и т.д. и т.д...
        <right name="general.adminpanel" access="false" />
        <right name="general.tab_players" access="false" />
        <right name="general.tab_resources" access="false" />
        ...и т.д. и т.д...
        <right name="command.freeze" access="false" />
        <right name="command.shout" access="false" />
        <right name="command.spectate" access="false" />
        ...и т.д. и т.д...
    </acl>


  • Function-записи регулируют скриптинговые функции MTA. Например, если ресурсу понадобилось воспользоваться restartResource, а он лишь в группе 'Everyone' (с acl-списком 'Default'), ему будет отказано в доступе к restartResource и он откажется полноценно работать.
  • Command-записи регулируют использование команд, которые создаются при использовании ресурсом addCommandHandler'ов. Примером использования команды служит ввод в чате /createvehicle [vehicle] при ресурсе freeroam. Данные записи контролируют, могут ли пользователи группы, использующей данный ACL-список, использовать эту команду. Заметка: команды не влияют на ресурсы внутри группы. Команды связаны только с пользователями.
    • General - самостоятельно придуманная группа записей, созданная ресурсом admin, хотя она работает по схожим принципам. Скрипт работает с ними через использование hasObjectPermissionTo


Вы заметите, что некоторые группы, такие как Admin, имеют несколько узлов <acl name="" />. Образцом далее служит группа Admin:

    <group name="Admin">
        <acl name="Moderator" />
        <acl name="SuperModerator" />
        <acl name="Admin" />
        <acl name="RPC" />
        <object name="resource.admin" />
        <object name="resource.webadmin" />
        <object name="user.Ransom" />
    </group>

Это дает все полномочия, описанные в каждом из узлов <acl name="" />, по порядку списка. Так что, например, группа Admin благодаря использованию всех ACL-списков удостоверяется, что администраторам даются все полномочия. Если получается слишком много конфликтов, приоритет отдается самой нижней записи. В образце выше:

1. <acl name="Default"> устанавливает <right name="general.http" access="false" /> <br\> 2. <acl name="Admin"> устанавливает <right name="general.ModifyOtherObjects" access="true" /> <br\> 3. Для всех пользователей и ресурсов в группе admin будет: <right name="general.ModifyOtherObjects" access="true" /><br\> <br\>

Группы и ACL ресурсов

Вы заметите, что вместе с использованием MTA появляются и некоторые другие группы. Они определены ресурсами, которые идут вместе с MTA. Если ресурс хочет обозначить собственные ACL-права, не предоставляемые группами MTA по умолчанию, он может создать ACL со своими собственными названием и группой и использовать его. Я покажу это на примере AMX. AMX предназначен для эмуляции SA-MP скриптов, и ему нужен определенный набор полномочий, который, в том числе, не входит в рамки групп по умолчанию. Он покан ниже:

    <group name="AMX">
        <acl name="AMX" />
        <object name="resource.amx" />
    </group>

    <acl name="AMX">
        <right name="general.ModifyOtherObjects" access="true" />
        <right name="function.startResource" access="true" />
        <right name="function.stopResource" access="true" />
        <right name="general.adminpanel" access="false" />
        ...и т.д. и т.д...
        <right name="command.kick" access="false" />
        <right name="command.freeze" access="false" />
        <right name="command.mute" access="false" />
       ...и т.д. и т.д...
    </acl>

Изменение ACL

Есть три способа изменения ACL - как это делать зависит от вас.

HTTP-интерфейс

Вы можете воспользоваться http-интерфейсом webadmin для изменения ACL через ваш веб-браузере. Это наиболее легкий способ. Просто удостоверьтесь, что на сервере запущен ресурс webadmin и посетите http://IPсервера:Httpпорт/. Затем вам будут доступны две секции - ACLs и Groups. ACLs позволяет вам создавать ваш Access Control List - список прав. Groups позволяет вам вместе группировать скопления пользователей и назначать им ACL-список. Например, секция ACLs позволяет вам указывать, что пользователи группы с ACL-списком Admin имеет доступ к консольной команде start. Затем вы можете зайти в секцию Groups и создать группу Admin, имеющую доступ к вашему acl-списку Admin. Потом вы сможете добавлять в вашу группу Admin пользователей.

XML-файл

Вы можете вручную изменять файл ACL.xml. Он обладает довольно простым синтаксисом, но может временами немного вводить в заблуждение. Если вы редактируете его, когда сервер запущен, либо потом не забудьте вызвать скриптинговую функцию aclReload ("start runcode", "run aclReload()"), чтобы новый ACL загрузился, либо перед внесением изменений остановите сервер. Это также предотвратит случайную перезапись ваших изменений сервером.

Функции скриптинга

Вы можете использовать огромное количество скриптинговых ACL-функций для его изменения "на лету". Конечно, можно (и на самом деле нужно!) ограничивать доступ к ACL-функциям через сам ACL. Заметьте, что ресурс admin, идущий вместе с MTA, может использоваться для распоряжения ACL (из вкладки "resources"). Вы должны быть админом сервера для использования этого. Нажмите здесь для инструкций по установке admin.

Также смотрите