Проверьте указанное c разрешение пользователя в виде ветки - PullRequest
1 голос
/ 09 апреля 2020

В виде TWIG моего проекта Symfony 5 у меня есть следующий фрагмент кода:

<table class="table table-hover table-striped datatable">
    <thead>
        <tr>
            <th>ID</th>
            <th>Username</th>
            <th>Email</th>
            <th>Created at</th>
        </tr>
    </thead>
    <tbody>
    {% for user in users %}
        <tr>
            <td>{{ user.id }}</td>
            <td>{{ user.name }}</td>
            <td>{{ user.email }}</td>
            <td>{{ user.createdAt|date('d/m/Y H:i') }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>

Ничего впечатляющего. Я хотел знать, есть ли способ проверить, имеет ли user в моем l oop конкретную c роль, скажем, ROLE_STAFF (Точнее, я хочу проверить это по иерархии. Если он имеет роль, которая «наследует» ROLE_STAFF, она также должна удовлетворять условию). Я видел этот пост , но он довольно старый, и я надеюсь, что, возможно, что-то было реализовано с момента его написания.

Я пытался внедрить AccessDecisionManagerInterface в моем User сущность без какого-либо хорошего результата. Мой метод (после этого) не работает, потому что $this->decisionManager является нулевым. Я предполагаю, что это не было введено должным образом. Я внедряю его с помощью конструктора:

public function __construct(AccessDecisionManagerInterface $decisionManager)
{
    $this->decisionManager = $decisionManager;
}

public function hasRolePermissions(string $role)
{
    $decisionManager = new AccessDecisionManager();
    $token = new UsernamePasswordToken($this, '', '', $this->getRoles());
    return $this->decisionManager->decide($token, [$role]);
}

Хотя решение, которое не использует isGranted, такое как услуга или инъекция, для меня совершенно приемлемо, я бы предпочел сделать его простым. Я планировал создать функцию ветки, но я хотел бы знать, изобретаю ли я колесо заново или нет. Это кажется достаточно распространенной проблемой, поэтому я надеюсь, что есть некоторые встроенные функции, о которых я не знаю.

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете использовать класс RoleHierarchy, чтобы найти все «достижимые» роли для текущего пользователя.

В структуре Symfony этот класс доступен как security.role_hierarchy service (автоматически помечается как Symfony\Component\Security\Core\Role\RoleHierarchyInterface).

// check for ROLE_STAFF while taking the role hierarchy into account
$isStaff = in_array(
    'ROLE_STAFF',
    $roleHierarchy->getReachableRoles($user->getRoles())
);

Вы можете написать пользовательское расширение Twig (например, пользовательский тест Twig) , чтобы иметь возможность сделать это в своих шаблонах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...