2017-02-11 40 views
1

以下設置:在Symfony 3中使用不同的登錄表單

我對兩個不同的用戶有兩個不同的登錄部分。

第一個用戶是普通用戶(Entity:AppBundle:User),第二個用戶是admin(實體:AppBundle:Admin)。

我有兩個不同的登錄路徑,提供商,防火牆和編碼器。 我可以作爲用戶或管理員登錄和註銷,沒有任何問題。

問題:

如果管理員已登錄我需要他留在管理域和不能夠訪問用戶登錄。如果正常用戶已經以用戶身份登錄,則不能以管理員身份登錄。

所以問題是,如果管理員登錄,他仍然可以切換到用戶登錄域並以用戶身份登錄,會話將包含用戶和管理員。

security.yml:

providers: 
    admin_db_provider: 
     name: admin_provider 
     entity: 
      class: AppBundle:Admin 
     ... 
    user_db_provider: 
     name: user_provider 
     entity: 
      class: AppBundle:User 
     ... 
firewalls: 
    admin_secured_domain: 
     pattern: ^/admin 
     anonymous: ~ 
     provider: admin_provider 
     form_login: 
      login_path: admin.authentication 
      check_path: admin.authentication 
      username_parameter: userName 
      pasword_parameter: password 
     ... 
    user_secured_domain: 
     pattern: ^/user 
     anonymous: ~ 
     provider: user_provider 
     form_login: 
      login_path: user.authentication 
      check_path: user.authentication 
      username_parameter: userName 
      pasword_parameter: password 
     ... 
access_control: 
    - { path: ^/user/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
encoders: 
    ... 

我想這是因爲我使用兩種不同的提供商的登錄檢查。

當我以用戶身份登錄並訪問管理員登錄名時,我可以在Symfony Profiler中看到用戶從「用戶」切換到「匿名」。和admin一樣,它從「admin」切換到「anon」。如果我以管理員身份登錄並訪問用戶登錄名。

我只需要將它們重定向回它們的域,但我現在無法檢查角色。

回答

1

你在找什麼是'安全上下文'。

見下面這個類似的問題: Session lost during impersonation

如果您希望用戶從不同的防火牆共享相同的安全上下文,那麼你必須定義在同一背景下的不同的防火牆:

# app/config/security.yml 
security: 
    # ... 
    firewalls: 
     admin_secured_domain: 
      # ... 
      context: my_context 
     user_secured_domain: 
      # ... 
      context: my_context 

請參閱symfony有關安全上下文的文檔: http://symfony.com/doc/current/reference/configuration/security.html#reference-security-firewall-context

大多數應用程序只需要一個防火牆。但是,如果您的應用程序使用多個防火牆,您會注意到如果您在一個防火牆中進行了身份驗證,則不會自動在另一個防火牆中進行身份驗證。換句話說,系統並不共享一個共同的「上下文」:每個防火牆的行爲就像一個單獨的安全系統。

相關問題