Получить роль пользователя, не вошедшего в систему TWIG Symfony2 - PullRequest
15 голосов
/ 31 января 2012

Я хотел бы знать, как я могу узнать, предоставлен ли пользователь, если он не является текущим пользователем в ветке.

Я использую этот код для текущего пользователя:

{% if is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% endif %}

Но я хотел бы иметь возможность сделать то же самое с другими пользователями, которые не вошли в систему в данный момент.Спасибо.

Редактировать: На самом деле, я думаю, что с помощью ветки нет прямого способа проверить роль пользователя, который не прошел проверку подлинности.Поэтому я сделал это прямо в шаблоне ветки, проверил, является ли пользователь администратором или нет, затем установил var.(В моем вопросе я искал, как это сделать в списке пользователей.)

{% set from_user_is_admin = false %}
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %}
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %}
{% endfor %}
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}

Ответы [ 4 ]

16 голосов
/ 14 июля 2013

Я думаю, было бы намного проще, если бы вы реализовали функцию isGranted в сущности User:

Class User implements UserInterface {
    ...
    public function isGranted($role)
    {
        return in_array($role, $this->getRoles());
    }
}

Теперь вы можете легко проверять наличие ролей в каждом слое вашего приложения. В PHP:

$user->isGranted("USER_ADMIN")

Или в веточке:

user.granted("USER_ADMIN")

Если вам нужно проверить роль для текущего пользователя, вы можете сделать это в Twig:

app.user.granted("USER_ADMIN")

Примечание: переменная "app" определена глобально.

Примечание 2: этот код может вызвать исключение, если вы используете его за пределами защищенной области вашего приложения, поскольку app.user будет иметь значение NULL.

9 голосов
/ 31 января 2012

Вы можете использовать выражение, аналогичное приведенному выше, с "not":

{% if not is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% endif %}

или используйте оператор else:

{% if is_granted('ROLE_USER') %}
    <a href="...">Delete</a>
{% else %}
    {# something else for guest user, not logged in #}
{% endif %}
4 голосов
/ 31 января 2012

Вы должны создать либо веточку макрос , либо функцию ветки.

Создать макрос очень просто, используя ваш код:

{% macro admin_status(from_user) %}
  {% set from_user_is_admin = false %}
  {% for role in from_user.getRoles() %} 
      {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %}
      {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %}
  {% endfor %}
  {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}
{% endmacro %}

Затем вы можете использовать его в том же файле, что и {% _self.admin_status(user) %}.Вы также можете переместить его в отдельный файл и использовать тег import для ветки, чтобы получить к нему доступ.

Лучше всего создать функцию ветки, подробнее см. расширение ветки.Это сводится к созданию обычной функции, которую можно вызывать из ветки, поэтому такой код становится возможным:

{% if user_is_admin(user) %}

Вам также нужно будет прочитать , включив пользовательские расширения ветки .

0 голосов
/ 27 января 2014

я сделал это таким образом, у меня есть этот фрагмент в глобальном файле ветки, в моем случае layout.html.twig

{% set is_admin = false %}
{% if app.security.token.user.roles is iterable %}
    {% for role in app.security.token.user.roles %}
        {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN'  %}
            {% set is_admin = true %}
        {% endif %}
    {% endfor %}
{% endif %}

тогда я могу использовать где угодно

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