Скрыть логин/регистрацию после аутентификации
Я ищу рабочее решение, чтобы скрыть страницы от аутентифицированных пользователей в 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, пользователи автоматически получают одну из следующих ролей в зависимости от того, как они аутентифицируются:
IS_AUTHENTICATED_REMEMBERED
IS_AUTHENTICATED_ANONYMOUSLY
IS_AUTHENTICATED_FULLY
Если у вас есть роль
IS_AUTHENTICATED_REMEMBERED
, то у вас также есть рольIS_AUTHENTICATED_ANONYMOUSLY
. Если у вас естьIS_AUTHENTICATED_FULLY
роль, тогда у вас также есть две другие роли. Другими словами, эти роли представляют собой три уровня повышения "сила" аутентификации.
Другими словами: Похоже, что нет возможный способ скрыть страницы от аутентифицированного пользователя...
1. Возможное решение - Использовать статическую роль (не работает...)
Использование роли контроля доступа IS_ANONYMOUS
может быть отличным вариантом, но это не работает для путей за брандмауэром: Symfony будет добавлять AnonymousToken
к вашему сеансу каждый раз, когда вы посещаете любую страницу позади ^/
:
# app/config/security.yml
security:
firewalls:
main:
pattern: ^/
...
2. Возможное решение - Редактировать все контроллеры (занимает слишком много времени...)
Я закончил переписать все контроллеры (.....) и внедрить пользовательские жестко запрограммированные правила доступа в контроллеры.
Я надеюсь, что у кого-то есть смешная проблема и простое глупое решение.
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() - это функции, определенные в этом контекст.
Подробнее о языке выражений: