2013-06-05 65 views
1

我在設置我的安全性時遇到了一些麻煩。匿名令牌即使在公共頁面登錄

我希望匿名和登錄成員都可以訪問一個頁面。我希望它根據情況顯示不同的內容(實際上,當我繼續時,我仍想以會員身份登錄)。

我想公開訪問的頁面是^/profile。

設置我security.yml這樣的:

jms_security_extra: 
secure_all_services: false 
expressions: true 

security: 
    encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 
    FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

    # Firewall pour les pages de connexion, inscription, et récupération de mot de passe 
     login: 
      pattern: ^/(login$|register|resetting) # Les adresses de ces pages sont login, register et resetting 
      anonymous: true      # On autorise bien évidemment les anonymes sur ces pages # Firewall principal pour le reste de notre site 
     public: 
      pattern:   ^/profile 
      anonymous:   true 
      homepage: 
      pattern: ^/$ 
       anonymous: true 
       main: 
        pattern: ^/       # ^/ = tout ce qui commence par/= tout notre site 
     form_login:       # On définit notre méthode d'authentification 
      provider: fos_userbundle   # On lie l'authentification au provider définit plus haut 
      remember_me: true     # On active la possibilité du "Se souvenir de moi" (désactivé par défaut) 
     remember_me: 
      key: %secret%      # On définit la clé pour le remember_me (%secret% est un parametre de parameters.yml) 
     anonymous: false      # On autorise les utilisateurs anonymes (non identifiés) 
     logout: true       # On autorise la déconnexion manuelle (désactivé par défaut) 
     #anonymous: ~ 
     #http_basic: 
     # realm: "Secured Demo Area"   

    access_control: 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 

我的問題是,當我登錄,我訪問該頁面,就好像我不是(我有我的記錄登錄按鈕),因爲防火牆給我一個匿名標記。

感謝您的幫助。 斯卡夫

回答

3

在認證常見的問題:如果您在使用多重防火牆,你對一個防火牆認證

多個防火牆不共享安全上下文
,你不會對任何其他認證防火牆自動。不同的防火牆就像不同的安全系統。爲此,您必須爲不同的防火牆明確指定相同的防火牆上下文。 但通常對於大多數應用程序來說,只有一個主防火牆就足夠了。

所以把所有的下一個主要的防火牆和使用ACL作爲FOSUSerBundle installation step 4

jms_security_extra: 
secure_all_services: false 
expressions: true 

security: 
    encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 
    FOS\UserBundle\Model\UserInterface: sha512 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 

    providers: 
     fos_userbundle: 
      id: fos_user.user_provider.username_email 

    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       remember_me: true 
      logout:  true 
      anonymous: true 
      remember_me: 
       key: %secret%   

    access_control: 
    - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/profile, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/, roles: ROLE_USER } 
+0

非常感謝,我不明白他們的安全背景是什麼意思,但它現在很清楚! – scaff

+0

安全上下文:防火牆IMHO的(經過身份驗證的)安全令牌。這就是爲什麼您沒有在第二個防火牆中進行身份驗證的原因,如果您先登錄。 –

+0

非常感謝,你幫了我很多答案。我試圖配置兩個沒有結果的安全區域。 – seipey

0

IMO您還沒有完全正確插入的文件,所以我不能肯定地說。但你可能有一個URL的2個防火牆。它的主防火牆

main: 
    pattern: ^/ 

和公共防火牆

public: 
    pattern: ^/profile 

嘗試指定只有一個防火牆。從official documenation

報價:如果您使用多個防火牆

多個防火牆不共享安全上下文 你對一個防火牆認證,你不會對任何自動其他防火牆認證。不同的防火牆就像不同的安全系統。爲此,您必須爲不同的防火牆明確指定相同的防火牆上下文。但通常對於大多數應用來說,只有一個主防火牆就足夠了。

+0

我想有這種圖案的公共頁面:'(?^ /($登錄|註冊|重置|簡介/ [0-9A-ZA-Z])| ^/$)' 和專用頁面:'^/[0-9A-ZA-Z] +'但問題依然存在,在公共頁面,我很喜歡在... 感謝您的幫助未登錄反正 – scaff

+0

嘗試刪除'主頁'和'公共'防火牆 –

+0

謝謝,但這就是我所做的,我現在只有兩個防火牆!(一個用於公共頁面,另一個用於私人頁面) – scaff