2

ROLE_ERECTA_TASK_ADMIN として新しい ROLE を作成する必要がありますが、Sonata 管理インターフェイスでそれを使用するためにどこで宣言する必要があるかわかりません。Sonata Bundle を使用してユーザー グループ ロールを管理しています。今はいくつかのロールしかありませんが、バンドルから別のロールを作成したいと考えています。

私の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

Sonata 管理者 ユーザー マネージャー: ここに画像の説明を入力

前もって感謝します。

4

5 に答える 5

0

管理者クラス内にカスタマイズされたアクションがいくつかあります。私がしていることは、管理クラス内でこれらを「構成」することです。標準の 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;
}

}

そこに接続します。この関数自体の Admin クラスを上書きするだけです (これは、Sonata\AdminBundle\Admin\Admin から拡張された BaseAdmin クラスで行いました)。

/**
 * 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;
}

そして、次のように上書きして、この配列を Admin クラスに入力します。

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

それでおしまい。努力とデザインは私にとってかなり公平に思えます。:-)

于 2015-01-16T07:48:28.357 に答える
-2

Rpg600のおかげで、別の方法を見つけました:)

このコードを vendor/bundles/Sonata/UserBundle/Form/Type/SecurityRolesType.php に書きました

public function getDefaultOptions(array $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

階層ロールに「_ALL」で終わるロールを追加すると、コードは内部のすべてのサブ要素をロードし、ソナタ管理フォーム ユーザーに新しいロール文字列を表示します。

コードによってロールが追加された Sonata Form Admin

ログインを実行すると、新しいロールが表示されます。

Symfony システムのアカウント情報

于 2013-08-24T23:43:49.830 に答える