2012-05-27 37 views
0

我正在努力管理用戶對我網站上某些頁面的訪問。我有一種完全認證的用戶(role: ROLE_MEMBER,根據ROLE_USER),當然也有匿名用戶。管理用戶對Symfony2頁面的訪問

比方說,我在網站上有兩頁(/index,/account),兩者都用secure: true。假設/index要求role: IS_AUTHENTICATED_ANONYMOUSLY/account要求role: IS_AUTHENTICATED_FULLY(對於ROLE_MEMBER)。

我想爲兩個頁面上的登錄成員顯示特殊的「帳戶菜單」,因此在模板中我檢查is_granted('ROLE_MEMBER')

當然,這對/account很有用。問題,當成員導航到/index(這是「匿名」頁面)功能is_granted('ROLE_MEMBER')返回0,和is_granted('IS_AUTHENTICATED_ANONYMOUSLY')返回1。當會員再次導航到/account時,所有內容都不會重新輸入密碼(這意味着會員仍未註銷)。

所以,問題是如何檢測哪些會員在/index頁面模板內登錄用戶?

已更新。 @ alessandro1997這裏是我的app/config/security.yml配置

security: 
    encoders: 
     AG\MemberBundle\Entity\Member: 
      id: member_saltedpassword_encoder 

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

    providers: 
     member_db: 
      entity: { class: AGMemberBundle:Member, property: email } 

    firewalls: 
     members: 
      pattern: ^/account 
      security: true 
      form_login: 
       login_path: /account/login 
       check_path: /account/login/check 
       post_only: true 
       username_parameter: _email 
       password_parameter: _password 
       default_target_path: /account/ 
       always_use_default_target_path: true 
       # csrf token options 
       csrf_parameter: _csrf_token 
       intention: authenticate 
      provider: member_db 
      logout: 
       path: /account/logout 
       target:/
      remember_me: 
       key:  "qwewqeqwerwxeweqweqwe" 
       lifetime: 3600 
       path: /
       domain: ~ # Defaults to the current domain from $_SERVER 
     pages: 
      pattern: ^/ 
      security: true 
      anonymous: ~ 

    access_control: 
     - { path: ^/account, roles: IS_AUTHENTICATED_FULLY } 
     - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
+0

這就奇怪了......你能證明你的** ** security.yml? –

+0

@ alessandro1997我用'security.yml'更新了我的問題 – gakhov

回答

1

發生這種情況是因爲您正在使用兩個單獨的防火牆,而您僅將用戶身份驗證到一個防火牆 - 它們完全是單獨的安全系統。您應該只設置一個防火牆,並使用具有不同角色簽名的access_control。

我有非常類似的問題 - 看看這裏 - >Symfony 2 - firewall and access control issue

0

我認爲這可能是一個問題:

access_control: 
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY } 
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 

首先你設置的訪問/賬戶,然後你可以訪問其覆蓋索引路徑:/。我認爲如果你換掉它也許可以。除此之外,我相信對匿名身份驗證的用戶使用訪問控制是沒有意義的。就用它來:

access_control: 
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY } 

另一個問題是,登錄和login_check隱藏在防火牆後面 - 用戶誰將會嘗試登錄將無法看到登錄頁面,因爲你只設置/賬號路徑爲充分驗證的用戶和現在:

form_login: 
      login_path: /account/login 
      check_path: /account/login/check 

我相信它應該有類似的東西的工作:

firewalls: 
      login_firewall: 
       pattern: ^/account/login$ 
       anonymous: ~ 
    access_control: 
    - { path: ^/account, roles: IS_AUTHENTICATED_FULLY } 
    - { path: ^/account/login, roles: IS_AUTHENTICATED_ANONYMOUSLY} 
    - { path: ^/account/login_check, roles: IS_AUTHENTICATED_ANONYMOUSLY} 

然而,在我的應用程序,我只是把登錄和login_check拍HS出/帳戶,所以security.yml看起來像這樣:

security: 
firewalls: 
    login_firewall: 
     pattern: ^/login$ 
     anonymous: ~ 
    secured_area: 
     pattern: ^/ 
     form_login: 
      login_path: /login 
      check_path: /login_check 
      always_use_default_target_path: true 
      default_target_path:/
     logout: 
      path: /logout 
      target:/

providers: 
    main: 
     entity: { class: Core\UserBundle\Entity\User, property: username } 
encoders: 
    Core\UserBundle\Entity\User: 
     algorithm: sha256 
     iterations: 10 
     encode_as_base64: true 
access_control: 
    - { path: ^/admin, roles: ROLE_SUPERADMIN } 
    - { path: ^/user, roles: ROLE_USER } 
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 

我不是一個Symfony的專家,它可能不是完美的解決方案,但我希望幫助;)