在我的网站上,我分为三个部分:管理员,成员和公共。管理员部分只能通过“ 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}
如您所见,我拥有管理上下文和主上下文。主要上下文在“成员”部分和“公共”部分之间共享。它在测试时确实按预期工作(在事件探查器的“安全性”选项卡中,都显示为“主”上下文)
问题是,当我尝试在公共部分中获取登录的用户信息时,总是得到匿名令牌(甚至在事件探查器中显示了匿名令牌),但是当我在“成员”部分中时,我可以正确获得登录用户。
我完全迷路了……
答案 0 :(得分:0)
好的,所以我设法解决了我的问题。问题来自会话处理。由于我有多个子域,因此未在它们之间共享会话,因此我的公共部分不知道用户已在成员部分中登录。
我唯一需要配置的是framework.yml
中的会话参数:
session:
handler_id: ~
cookie_domain: '.%domain%'
name: 'MYAPPSESSID'
编辑:这个SO答案有助于我发现和解决问题:https://stackoverflow.com/a/29850083/1907465