Symfony 4: анонимный токен на общедоступной странице даже после входа в систему - PullRequest
0 голосов
/ 18 ноября 2018

На моем сайте есть 3 раздела: Администратор, Члены и Публичный. Раздел администратора доступен только через «gestion.% Domain%» и должен иметь пользователя-администратора. Этот раздел прекрасно работает.

Для раздела «Участники» он доступен через «membre.% Domain%» и должен иметь пользователя-участника. Это также прекрасно работает.

Проблема доходит до публичного раздела. Каждая часть этого раздела доступна либо анонимно, либо авторизована с помощью пользователя. При входе в систему верхнее меню немного изменится, чтобы отобразить дополнительные параметры (вроде как на любом торговом веб-сайте).

Итак, я настроил свои параметры безопасности следующим образом:

security:
    providers:
        membre_provider:
            id: App\Security\Provider\MembreProvider
        manager_provider:
            id: App\Security\Provider\ManagerProvider

    encoders:
        App\Entity\Utilisateur: sha512

    role_hierarchy:
        ROLE_MEMBRE: [ROLE_NON_MEMBRE]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN]
        ROLE_ADMIN: [ROLE_EDITEUR]

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        admin:
            host: 'gestion.%domain%'
            pattern: .*
            anonymous: ~
            form_login:
                login_path: admin_login
                check_path: admin_login
            access_denied_url: admin_access_denied
            provider: manager_provider
            logout:
                path:   admin_logout
                target: admin_login
        main:
            pattern: .*
            anonymous: true
            form_login:
                login_path: membre_login
                check_path: membre_login
            access_denied_url: membre_login
            provider: membre_provider
            user_checker: App\Security\MembreUserChecker
            logout:
                path:   membre_logout
                target: index
            remember_me:
                secret:   '%kernel.secret%'
                name: 'remember_me_main'
                lifetime: 604800 # 1 week in seconds
                path:     /
                always_remember_me: true
    access_control:
        - { path: ^/connexion, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: 'membre.%domain%' }
        - { path: ^/demande_reinitialisation, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: 'membre.%domain%' }
        - { path: ^/reinitialisation, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: 'membre.%domain%' }
        - { path: ^/, roles: ROLE_NON_MEMBRE, host: 'membre.%domain%'}
        - { path: ^/connexion, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: 'gestion.%domain%' }
        - { path: ^/, roles: ROLE_EDITEUR, host: 'gestion.%domain%'}
        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY}

Как видите, у меня есть контекст администратора и основной контекст. Основной контекст разделяется между разделами «Члены» и «Публичный». И он работает как задумано при тестировании (на вкладке «Безопасность» профилировщика оба отображаются как «основной» контекст)

Проблема в том, что когда я пытаюсь получить информацию о зарегистрированных пользователя в публичном разделе, я всегда получаю анонимный токен (он даже показывает анонимный токен в профилировщике), но когда я нахожусь в разделе «Участники» Я могу получить зарегистрированного пользователя правильно.

Я полностью потерян там ...

1 Ответ

0 голосов
/ 18 ноября 2018

Хорошо, мне удалось решить мою проблему.Проблема возникла из-за обработки сеанса.Так как у меня есть несколько поддоменов, сеанс не был разделен между ними, поэтому мой публичный раздел не знал, что пользователь вошел в раздел участника.

Единственное, что мне нужно было настроить, этопараметры сеанса в framework.yml:

session:
    handler_id: ~
    cookie_domain: '.%domain%'
    name: 'MYAPPSESSID'

РЕДАКТИРОВАТЬ: Этот SO ответ помог мне в поиске и решении проблемы: https://stackoverflow.com/a/29850083/1907465

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