0

我正在管理用户对我网站上某些页面的访问权限。我有 1 种完全经过身份验证的用户(role: ROLE_MEMBER, based on ROLE_USER),当然还有匿名用户。

假设我在网站上有 2 个页面 ( /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 }
4

2 回答 2

1

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

我遇到了非常相似的问题 - 在这里查看 -> Symfony 2 - 防火墙和访问控制问题

于 2012-06-13T08:39:14.427 回答
0

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

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

首先,您要设置对 /account 的访问权限,然后使用对 index path: / 的访问权限来覆盖它。我想如果你能交换它可能没问题。此外,我认为对经过身份验证的用户使用访问控制毫无意义。改用它:

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

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

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

于 2012-06-12T07:42:52.683 回答