在我的网站上,除了一些特定页面(登录,注册,pwd重置),用户需要登录 . 我已经实现了 remember me
功能,效果很好 .
我想要实现的是,对于管理页面,用户应该有 admin role and not remembered
. 为了检查这个要求,我在相关的access_control规则中使用了 allow_if
,但它拒绝了我的管理员用户的访问权限,虽然会话没有被记住,我可以在调试工具栏上确认该会话有 UsernamePasswordToken
.
我的access_control规则如下:( 4th one doesn't work )
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/user/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, allow_if: "has_role('ROLE_ADMIN') and has_role('IS_AUTHENTICATED_FULLY')" }
- { path: ^/, role: IS_AUTHENTICATED_REMEMBERED }
如果我从相关的访问控制规则中删除 and has_role('IS_AUTHENTICATED_FULLY')
部分,用户可以通过授权,因此问题似乎是这一部分 .
has_role('IS_AUTHENTICATED_FULLY')
有什么问题?
Symfony版本:2.7.5
2 回答
好吧,我找到了解决问题的解决方法 .
How to use Expressions in Security, Routing, Services, and Validation官方网站上的食谱文章有一个相关部分,并说明可能使用
is_remember_me()
和is_fully_authenticated()
方法来检查各自存在的IS_AUTHENTICATED_REMEMBERED
和IS_AUTHENTICATED_FULLY
角色 .使用该文档部分,我按如下方式修改了访问控制规则,现在可以使用:
但是,我仍然认为这是一个问题,并不是预期的行为 . 所以,我在官方问题跟踪器中打开了一个问题:
Github Issue: #16096 - Expression engine has_role() function can't process implicit roles
Documentation:
你试图使用第一种方式,但它可能只用第二种方式 .
您需要在控制器中插入代码来执行授权检查
您也可以使用SensioFrameworkExtraBundle,只需在控制器中添加注释即可