Мне нужно добавить новую пользовательскую РОЛЬ в symfony 2 для управления разрешением в пакете SONATA.

Мне нужно создать новую РОЛЬ как ROLE_ERECTA_TASK_ADMIN, но я не знаю, как, где я должен объявить, чтобы установить ее в административном интерфейсе Sonata? Я использую Sonata Bundle для управления своей ролью в группе пользователей, теперь у меня есть только некоторые РОЛИ, но я хочу создать какую-то другую форму моих пакетов.

Моя безопасность.yml

role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER, ROLE_SONATA_ADMIN]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
        # PROTEZIONE MODULO TASK
        ROLE_ERECTA_TASK_ADMIN: [ROLE_ERECTA_TASK_USER]
        ROLE_ERECTA_TASK_SA: [ROLE_ERECTA_TASK_ADMIN, ROLE_ALLOWED_TO_SWITCH]
        SONATA:
            - ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT  # if you are using acl then this line must be commented

Менеджер пользователей Sonata Admin: введите здесь описание изображения

Заранее спасибо.


person Gianluca Lodigiani    schedule 23.08.2013    source источник


Ответы (5)


Существует еще один быстрый обходной путь для добавления ролей. Просто отредактируйте security.yml и добавьте роли в ROLE_SUPER_ADMIN.

role_hierarchy:
    ...
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, ROLE_FOO, ROLE_BAR, ...]
person TautrimasPajarskas    schedule 25.08.2013
comment
Спасибо, я могу добавить в ROLE_SUPER_ADMIN и ROLE_ADMIN свои новые роли. Это не меняет никаких файлов Sonata, поэтому все очень чисто. Для новой версии моего программного обеспечения я попытаюсь настроить свои роли таким образом. - person Gianluca Lodigiani; 27.08.2013

Я предлагаю вам настроить роли вручную в formMapper следующим образом:

$formMapper->with('Roles')
                ->add('roles', 'choice',
                    array('choices'=>
                    array('ROLE_SUPER_ADMIN' => 'ROLE_SUPER_ADMIN', 'ROLE_...' => 'ROLE_...'),
                        'expanded'=> true,
                        'multiple'=> true))
                ->end();

Также добавьте к своим ролям ROLE_ADMIN и ROLE_SONATA_ADMIN.

person rpg600    schedule 23.08.2013

для более гибкой реализации можно также переопределить vendor/sonata-project/user-bundle/Security/EditableRolesBuilder.php.

Не редактируйте этот файл напрямую, а сделайте это с помощью наследования пакета или переопределите сервис sonata.user.editable_role_builder для внедрения пользовательского класса.

person roelleor    schedule 29.10.2014

У меня есть некоторые индивидуальные действия в моих классах администратора. Что я делаю, так это просто «настраиваю» их в классах администратора. Стандартный Sonata\UserBundle\Security\EditableRolesBuilder вызывает общедоступную функцию класса Sonata BaseAdmin "getSecurityInformation":

foreach ($admin->getSecurityInformation() as $role => $permissions) {
$role = sprintf($baseRole, $role);
if ($isMaster) {
    // if the user has the MASTER permission, allow to grant access the admin roles to other users
    $roles[$role] = $role;
} elseif ($this->securityContext->isGranted($role)) {
    // although the user has no MASTER permission, allow the currently logged in user to view the role
    $rolesReadOnly[$role] = $role;
}

}

Вот где я подключаюсь. Просто перезапишите эту функцию собственным классом администратора (я сделал это в своем классе BaseAdmin, который расширяется от Sonata\AdminBundle\Admin\Admin)

/**
 * List here the customized roles actions which are used within the Admin class you have extended. (e.g. the
 * CustomerAdmin uses a special function to login as the customer. In this case set the array to array('LOGIN') and
 * use at certain points like ->isGranted('LOGIN'). This is also available in templates like
 * admin.isGranted('LOGIN', object)).
 * The actions you are listing here, will be appended to the standard actions: EDIT, LIST, CREATE, VIEW, DELETE,
 * EXPORT, OPERATOR, MASTER.
 *
 * @see http://sonata-project.org/bundles/admin/master/doc/index.html
 *
 * @var array
 */
protected $customizedRoles = array();

/**
 * {@inheritdoc}
 */
public function getSecurityInformation()
{
    $standardAdminRoles = parent::getSecurityInformation();
    $customizedAdminRoles = $this->getCustomizedAdminRoles();

    $allAdminRoles = array_merge($standardAdminRoles, $customizedAdminRoles);
    ksort($allAdminRoles);

    return $allAdminRoles;
}

/**
 * Get the customized roles set at property of the Admin class 'customizedRoles' prepared to append to the standard
 * roles.
 *
 * @return array
 */
private function getCustomizedAdminRoles()
{
    $customizedRoles = array();

    if (is_array($this->customizedRoles) && !empty($this->customizedRoles)) {
        foreach ($this->customizedRoles as $customizedRole) {
            $customizedRole = strtoupper($customizedRole);
            $customizedRoles[$customizedRole] = $customizedRole;
        }
    }

    return $customizedRoles;
}

И просто заполните этот массив в своем классе администратора, перезаписав:

/** @{inheritdoc} */
protected $customizedRoles = array('LOGIN');

Вот и все. Усилия и дизайн кажутся мне довольно справедливыми. :-)

person Nico Schunke    schedule 16.01.2015

Я нашел другой способ, спасибо Rpg600 :)

Я написал этот код на странице vendor/bundles/Sonata/UserBundle/Form/Type/SecurityRolesType.php.

публичная функция getDefaultOptions(массив $options) {$options = parent::getDefaultOptions($options);

$roles = array();
//== MY-CODE ============================================================================================================
$Role_to_add= array();
foreach ($this->pool->getContainer()->getParameter('security.role_hierarchy.roles') as $key => $value_roles_group_array)
    if('_ALL'== substr($key,-4,4))
            foreach ($value_roles_group_array as $key => $new_roles_string)
                $roles[$new_roles_string]=$new_roles_string;
//======================================================================================================================                
$rolesReadOnly = array();

...

Теперь в app/config/security.yml

role_hierarchy:
    ROLE_ADMIN:       [ROLE_USER, ROLE_SONATA_ADMIN]
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    # PROTEZIONE MODULO TASK
    ROLE_ERECTA_TASK_ALL: [ROLE_ERECTA_TASK_USER, ROLE_ERECTA_TASK_ADMIN, ROLE_ERECTA_TASK_SA]
    ROLE_ERECTA_TASK_ADMIN: [ROLE_ERECTA_TASK_USER]
    ROLE_ERECTA_TASK_SA: [ROLE_ERECTA_TASK_ADMIN, ROLE_ALLOWED_TO_SWITCH]
    SONATA:
        - ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT  # if you are using acl then this line must be commented

Когда я добавляю в иерархическую роль ROLE, оканчивающуюся на «_ALL», мой код загружает все подэлементы внутри, показывая новую строку роли в пользовательской форме администратора сонаты.

Администратор формы Sonata с ролями, добавленными моим кодом

Теперь, когда я выполняю вход, я вижу свои новые роли.

Информация об учетной записи Symfony System

person Gianluca Lodigiani    schedule 24.08.2013
comment
Чрезвычайно плохая идея редактировать что-либо в каталоге поставщика. - person pestaa; 20.11.2013
comment
Да, это абсолютно последнее, что вы хотите сделать, если вообще когда-либо - person Prof; 20.12.2015