Скрипт для создания менеджера
Скрипт для создания пользователей с определенными правами и своим источником файлов для админки.
По умолчанию будет создан менеджер с логинам и паролем manager и медиа источником с корневым каталогам assets/uploads из прав у пользователя будет только возможность работать с ресурсами, а c пунктов меню доступ только к «Приложения»
Для настройки политики доступа необходимо в массив $accessPolicy добавить название определенной политики с значение 0 или 1
Способ использования
1) Установить в Modx дополнение Console после чего скопировать php код и выполнить в консоли
2) Скопировать modxaccessmanager.php в assets, раскомментировать сверху скрипта кусок кода после чего дернуть его по url my-site.ru/assets/modxaccessmanager.php Отчет о выполненой работе можно посмотреть в my-site.ru/manager/?a=system/event
Весь список политик доступов можно посмотреть на github
По умолчанию будет создан менеджер с логинам и паролем manager и медиа источником с корневым каталогам assets/uploads из прав у пользователя будет только возможность работать с ресурсами, а c пунктов меню доступ только к «Приложения»
Для настройки политики доступа необходимо в массив $accessPolicy добавить название определенной политики с значение 0 или 1
Способ использования
1) Установить в Modx дополнение Console после чего скопировать php код и выполнить в консоли
2) Скопировать modxaccessmanager.php в assets, раскомментировать сверху скрипта кусок кода после чего дернуть его по url my-site.ru/assets/modxaccessmanager.php Отчет о выполненой работе можно посмотреть в my-site.ru/manager/?a=system/event
Весь список политик доступов можно посмотреть на github
<?php
/*define('MODX_API_MODE', true);
require_once dirname(dirname(__FILE__)) . '/index.php';
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');*/
$NAME = 'manager';
$groupName = $NAME; // Название группы пользователей
$mediaSourceName = $NAME; // Название медиа источника
$roleAuthority = 9; // Ранг роли
$mediaSourcePath = 'assets/uploads/'; // Путь для медиа источника, если указать пустую строку медиа источник создаваться не будет
$bindMediaSourceTv = true; // Привязывать ли источник файлов ко всем tv. Предыдущие источники будут отвязаны
$contextKey = 'web';
$users = array(
$NAME => array(
'username' => $NAME,
'password' => $NAME, // min 6 символов
'email' => '',
),
);
$accessPolicy = array(
'access_permissions' => 0, //Страницы и действия, связанные с правами доступа.
'dashboards' => 0, //Просмотр и управление панелями.
'element_tree' => 0, //Возможность просмотра дерева элементов в левой навигационной панели.
'menu_reports' => 0, //Показывать в верхнем меню пункт «Отчёты».
'menu_security' => 0, //Показывать в верхнем меню пункт «Безопасность».
'menu_site' => 0, //Показывать в верхнем меню пункт «Сайт».
'menu_system' => 0, //Показывать в верхнем меню пункт «Система».
'menu_tools' => 0, //Показывать в верхнем меню пункт «Инструменты».
'new_static_resource' => 0, //Создавать новые статичные ресурсы.
'packages' => 0, //Использовать пакеты в системе управления пакетами.
'remove_locks' => 0, //Удалять все блокировки на сайте.
'settings' => 0, //Смотреть и редактировать системные настройки.
'sources' => 0, //Управлять источниками файлов и типами источников файлов.
);
//Создаем новый шаблон политики доступа на основании админавского
$modx->lexicon->load('policy');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
if ($templatePolicy = $modx->getObject('modAccessPolicyTemplate', array('name' => $NAME))) {
$templatePolicyId = $templatePolicy->id;
} else {
$response = $modx->runProcessor('security/access/policy/template/duplicate', array(
'id' => 1, // Administrator template id
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$templatePolicyId = $response->getObject()['id'];
$response = $modx->runProcessor('security/access/policy/template/update', array(
'id' => $templatePolicyId,
'name' => $NAME,
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
}
//Создаем политику доступа
if (!$policy = $modx->getObject('modAccessPolicy', array('name' => $NAME))) {
$response = $modx->runProcessor('security/access/policy/create', array(
'name' => $NAME,
'template' => $templatePolicyId,
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$policyId = $response->getObject()['id'];
if (!$policy = $modx->getObject('modAccessPolicy', $policyId)) {
return $modx->log(modX::LOG_LEVEL_ERROR, $modx->lexicon('policy_err_nf'));
}
} else {
$policyId = $policy->id;
}
$policyData = array_merge($policy->get('data'), $accessPolicy);
$policy->set('data', $modx->toJSON($policyData));
if ($policy->save() == false) {
return $modx->log(modX::LOG_LEVEL_ERROR, $modx->lexicon('policy_err_save'));
}
// Создаем роль
if ($role = $modx->getObject('modUserGroupRole', array('name' => $NAME))) {
$roleId = $role->id;
} else {
$response = $modx->runProcessor('security/role/create', array(
'name' => $NAME,
'authority' => $roleAuthority,
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$roleId = $response->getObject()['id'];
}
// Создаем группу пользователей
if ($group = $modx->getObject('modUserGroup', array('name' => $NAME))) {
$groupId = $group->id;
} else {
$response = $modx->runProcessor('security/group/create', array(
'name' => $groupName,
'parent' => 1,
'aw_contexts' => 'web',
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$groupId = $response->getObject()['id'];
}
// Добавляем контекст - mgr в группу пользователей
$contextData = array(
'target' => 'mgr',
'authority' => $roleAuthority,
'policy' => $policyId,
'principal' => $groupId,
);
if ($context = $modx->getObject('modAccessContext', $contextData)) {
$contextId = $context->id;
} else {
$response = $modx->runProcessor('security/access/usergroup/context/create', $contextData);
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$contextId = $response->getObject()['id'];
}
// Редактируем контекст - web для группу пользователей
if ($contextWeb = $modx->getObject('modAccessContext', array('target' => 'web', 'principal' => $groupId))) {
$response = $modx->runProcessor('security/access/usergroup/context/update', array(
'id' => $contextWeb->id,
'target' => 'web',
'authority' => $roleAuthority,
'policy' => 2, //Политика доступа - Administrator.
'principal' => $groupId,
));
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
} else {
$modx->log(modX::LOG_LEVEL_ERROR, 'Not find context Web');
}
// Создаем пользователей и добовляем в группу
$modx->setOption('password_min_length',6);
foreach ($users as $key => $user) {
$isEmail = isset($user['email']) && !empty($user['email']);
if ($u = $modx->getObject('modUser', array('username' => $user['username']))) {
$userId = $u->id;
} else {
$response = $modx->runProcessor('security/user/create', array(
'username' => $user['username'],
'active' => 1,
'class_key' => 'modUser',
'newpassword' => false,
'passwordnotifymethod' => $isEmail ? 'e' : 's',
'passwordgenmethod' => 'spec',
'specifiedpassword' => $user['password'],
'confirmpassword' => $user['password'],
'email' => $isEmail ? $user['email'] : $key . '@' . MODX_HTTP_HOST,
));
if ($response->isError()) {
$modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
continue;
}
$modx->error->reset();
$userId = $response->getObject()['id'];
$groupMemberData = array(
'member' => $userId,
'user_group' => $groupId,
'role' => $roleId,
);
if (!$UserGroupMember = $modx->getObject('modUserGroupMember', $groupMemberData)) {
$UserGroupMember = $modx->newObject('modUserGroupMember');
$UserGroupMember->fromArray($groupMemberData);
if (!$UserGroupMember->save()) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Error save user in group');
}
}
}
}
if (!empty($mediaSourcePath)) {
// Редактирование прав доступа для источника файлов Filesystem
$mediaAccessSourceData = array(
'target' => 1, // Filesystem ID
'principal_class' => 'modUserGroup',
'principal' => 1, // Группа пользователей - Administrator
'authority' => 0, // Минимальная роль
'policy' => 8, // Политика - Media Source Admin
'context_key' => '',
);
if (!$acl = $modx->getObject('sources.modAccessMediaSource', $mediaAccessSourceData)) {
$acl = $modx->newObject('sources.modAccessMediaSource');
$acl->fromArray($mediaAccessSourceData, '', true, true);
if (!$acl->save()) {
return $modx->log(modX::LOG_LEVEL_ERROR, 'Error update access source data Filesystem');
}
}
// Создаем источник файлов
if (!is_dir(MODX_BASE_PATH . $mediaSourcePath)) {
if (!$modx->cacheManager->writeTree(MODX_BASE_PATH . $mediaSourcePath)) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Error create dir for media source ' . $mediaSourceName);
}
}
$mediaSourceData = array(
'name' => $mediaSourceName,
'class_key' => 'sources.modFileMediaSource',
);
if (!$mediaSource = $modx->getObject('sources.modMediaSource', $mediaSourceData)) {
$response = $modx->runProcessor('source/create', $mediaSourceData);
if ($response->isError()) {
return $modx->log(modX::LOG_LEVEL_ERROR, $response->getMessage());
}
$mediaSourceId = $response->getObject()['id'];
$mediaSource = $modx->getObject('sources.modMediaSource', $mediaSourceId);
}
$mediaSourceProperties = $mediaSource->getProperties();
$mediaSourceProperties['basePath']['value'] = '/' . $mediaSourcePath;
$mediaSourceProperties['baseUrl']['value'] = $mediaSourcePath;
$mediaSource->setProperties($mediaSourceProperties);
if (!$mediaSource->save()) {
return $modx->log(modX::LOG_LEVEL_ERROR, 'Error save media source for ' . $mediaSourceName);
}
$mediaAccessSourceData = array(
'target' => $mediaSource->id,
'principal_class' => 'modUserGroup',
'principal' => $groupId,
'authority' => $roleAuthority,
'policy' => 8, // Политика - Media Source Admin
'context_key' => '',
);
if (!$acl = $modx->getObject('sources.modAccessMediaSource', $mediaAccessSourceData)) {
$acl = $modx->newObject('sources.modAccessMediaSource');
$acl->fromArray($mediaAccessSourceData, '', true, true);
if (!$acl->save()) {
return $modx->log(modX::LOG_LEVEL_ERROR, 'Error update access source data ' . $mediaSourceName);
}
}
// Привязываем источник файлов ко всем tv
if ($bindMediaSourceTv && $tvs = $modx->getCollection('modTemplateVar')) {
foreach ($tvs as $tv) {
$sourceElements = $modx->getCollection('sources.modMediaSourceElement', array(
'object' => $tv->id,
'object_class' => 'modTemplateVar',
'context_key' => $contextKey,
));
foreach ($sourceElements as $sourceElement) {
$sourceElement->remove();
}
$sourceElement = $modx->newObject('sources.modMediaSourceElement');
$sourceElement->fromArray(array(
'object' => $tv->id,
'object_class' => $tv->_class,
'context_key' => $contextKey,
), '', true, true);
$sourceElement->set('source', $mediaSource->id);
$sourceElement->save();
}
}
}
// Перезагрузить все права доступа и очистить кэш.
$modx->runProcessor('security/access/flush', array());
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->log(modX::LOG_LEVEL_INFO, 'success!!');
Поблагодарить автора
Отправить деньги
Комментарии: 7
must-have! Спасибо!
На чистом MODX через консоль попробовал, ошибка вылетает
[2016-10-13 16:36:22] (INFO @ /home/s6897/www/core/components/console/processors/exec.class.php(15) : eval()'d code : 303)
success!!
Ошибка ли?
Тупанул)) я просто написал, так как увидел, все классно отрабатывает, вот бы ещё с siteExtra бы связать, пробовал добавить, всё ок добавилось, только установка зависает и кнопка «ок» не активна.
Возникла ошибка первый раз, до этого все было отлично на других сайтах
Parse error: syntax error, unexpected '[' in /home/s/dfsgrg/public_html/core/components/console/processors/exec.class.php(24) : eval()'d code on line 49
куда копать подскажите?
у меня после запуска скрипта через консоль перестали отображаться картинки по всему сайту (сайт уже существовал и был заполнен контентом). Вручную отменял настройки.
Это так и должно быть или нужно перед запуском скрипта какие-то еще манипуляции делать? Или скрипт надо только на чистый сайт запускать?
Это так и должно быть или нужно перед запуском скрипта какие-то еще манипуляции делать? Или скрипт надо только на чистый сайт запускать?
сам стормозил. надо было в скрипте перед запуском поставить
$mediaSourcePath = ' ';
$bindMediaSourceTv = true;
$mediaSourcePath = ' ';
$bindMediaSourceTv = true;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.