2012-05-27 38 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的专家,它可能不是完美的解决方案,但我希望帮助;)