Symfony 4:即使登录后仍在公共页面中显示匿名令牌

时间:2018-11-18 19:08:11

标签: php symfony security symfony4

在我的网站上,我分为三个部分:管理员,成员和公共。管理员部分只能通过“ gestation。%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 :(得分:0)

好的,所以我设法解决了我的问题。问题来自会话处理。由于我有多个子域,因此未在它们之间共享会话,因此我的公共部分不知道用户已在成员部分中登录。

我唯一需要配置的是framework.yml中的会话参数:

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

编辑:这个SO答案有助于我发现和解决问题:https://stackoverflow.com/a/29850083/1907465