管理用户对Symfony2中页面的访问权限

时间:2012-05-27 10:49:41

标签: symfony twig access-control

我正在努力管理用户访问我网站上某些页面的权限。我有一种完全通过身份验证的用户(role: ROLE_MEMBER,基于ROLE_USER),当然还有匿名用户。

假设我在网站上有2个页面(/index/account),都有secure: true。假设/index需要role: IS_AUTHENTICATED_ANONYMOUSLY/account需要role: IS_AUTHENTICATED_FULLYROLE_MEMBER)。

我想在两个页面上为登录成员显示特殊的“帐户菜单”,因此在模板中我会检查is_granted('ROLE_MEMBER')

当然,这对/account很有用。当成员导航到/index(“匿名”页面)时,问题is_granted('ROLE_MEMBER')会返回0is_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 }

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您使用的是两个独立的防火墙,并且您只对一个防火墙验证用户 - 它们是完全独立的安全系统。您应该只设置一个防火墙,并使用带有不同角色签名的access_control。

我遇到了类似的问题 - 请在此处查看 - > Symfony 2 - firewall and access control issue

答案 1 :(得分:0)

我认为这可能是一个问题:

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

首先,您要设置对/ account的访问权限,然后通过访问索引路径来覆盖它:/。我想如果你要交换它可能没问题。此外,我认为对于authenticated_annonymously的用户使用访问控制毫无意义。请改用:

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

另一个问题是login和login_check隐藏在防火墙后面 - 尝试登录的用户将无法看到登录页面,因为您只为完全通过身份验证的用户设置了/ account路径,现在:< / p>

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}

但是,在我的应用程序中,我只是从/ account中取出login和login_check路径,因此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专家,它可能不是完美的解决方案,但我希望有所帮助;)