Скрыть логин/регистрацию после аутентификации


Я ищу рабочее решение, чтобы скрыть страницы от аутентифицированных пользователей в symfony. К сожалению, роли пользователей по умолчанию расположены в шахматном порядке. Следующая конфигурация не работает:

# app/config/security.yml
access_control:

    # This rules works not:
    - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }

    # This rule works:
    - { path: ^/logout$, role: roles: [ROLE_USER] } 

На мой взгляд, этот набор правил должен оказаться в HTTP 404 Несанкционированным после посещения /login или /register в качестве аутентифицированного пользователя (UsernamePasswordToken) - но это не так!

После некоторых повторных поисков я нашел больше информации. Согласно документации Symfony 2, пользователи автоматически получают одну из следующих ролей в зависимости от того, как они аутентифицируются:

  1. IS_AUTHENTICATED_REMEMBERED
  2. IS_AUTHENTICATED_ANONYMOUSLY
  3. IS_AUTHENTICATED_FULLY

Если у вас есть роль IS_AUTHENTICATED_REMEMBERED, то у вас также есть роль IS_AUTHENTICATED_ANONYMOUSLY. Если у вас есть IS_AUTHENTICATED_FULLY роль, тогда у вас также есть две другие роли. Другими словами, эти роли представляют собой три уровня повышения "сила" аутентификации.

enter image description here

Другими словами: Похоже, что нет возможный способ скрыть страницы от аутентифицированного пользователя...


1. Возможное решение - Использовать статическую роль (не работает...)

Использование роли контроля доступа IS_ANONYMOUS может быть отличным вариантом, но это не работает для путей за брандмауэром: Symfony будет добавлять AnonymousToken к вашему сеансу каждый раз, когда вы посещаете любую страницу позади ^/:

# app/config/security.yml
security:
    firewalls:
        main:
            pattern: ^/
...

2. Возможное решение - Редактировать все контроллеры (занимает слишком много времени...)

Я закончил переписать все контроллеры (.....) и внедрить пользовательские жестко запрограммированные правила доступа в контроллеры.


Я надеюсь, что у кого-то есть смешная проблема и простое глупое решение.

Author: BoltClock, 2014-01-27

1 answers

Вы можете легко решить эту проблему с помощью компонента языка выражений (symfony ~2.4):

access_control:
    - { path: ^/whatever, allow_if: "!is_fully_authenticated()" }

Для symfony jmssecurityextrabundle, который также предоставляет правила безопасности на основе выражений.

Запрос, токен и пользователь - это переменные, к которым у вас есть доступ, и is_anonymous(), is_authenticated(), is_fully_authenticated(), is_rememberme() и has_role() - это функции, определенные в этом контекст.

Подробнее о языке выражений:

 2
Author: nifr, 2014-01-27 11:28:17