2

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

Мой 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_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 

соната Администратор Менеджер Пользователь: enter image description here

Спасибо заранее.

ответ

1

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

role_hierarchy: 
    ... 
    ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, ROLE_FOO, ROLE_BAR, ...] 
+0

Спасибо, я могу добавить под ROLE_SUPER_ADMIN и ROLE_ADMIN мои новые роли, это не изменяет никакого файла Sonata, поэтому очень чисто. Для новой версии моего программного обеспечения я постараюсь установить свои роли таким образом. –

2

Я предлагаю вам настроить роли вручную в 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 ваших ролей.

-2

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

Я написал этот код на поставщика/жгутов/Sonata/UserBundle/Форма/тип/SecurityRolesType.php

общественная функция getDefaultOptions (массив $ вариантов) { $ 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(); 

... 

Теперь в приложении/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 

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

Sonata Form Admin with the roles added by my code

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

Symfony System account info

+9

Чрезвычайно плохая идея редактировать что-либо в каталоге поставщика. – pestaa

+0

Да, это абсолютная последняя вещь, которую вы хотите сделать, если вообще когда-либо вообще – Prof83

0

для более гибкой реализации можно также переопределить поставщика/соната-проект/пользователь-расслоение/Безопасность/EditableRolesBuilder.php.

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

0

У меня есть некоторые индивидуальные действия в моих классах Admin. То, что я делаю, просто «настраивает» их внутри классов admin. Стандартная соната \ 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 классе, который простирается от Сонаты \ 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'); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^