我正在努力管理用户访问我网站上某些页面的权限。我有一种完全通过身份验证的用户(role: ROLE_MEMBER
,基于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 }
答案 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专家,它可能不是完美的解决方案,但我希望有所帮助;)