Symfony无法检测FOSUser中的角色

时间:2014-10-20 09:37:01

标签: symfony fosuserbundle roles

我是第一次使用FOSUser建立网站的用户管理,我在搞清楚搞砸的地方时遇到了一些麻烦。

该角色位于roles列的数据库中,如下所示:

a:1:{i:0;s:10:"ROLE_ADMIN";}

当我从控制器执行var_dump($this->getUser())时,我得到了这个:

(...)
["roles":protected]=> array(1) { [0]=> string(10) "ROLE_ADMIN" }
(...)

所以一切都很好。

当我从控制器尝试if ($this->get('security.context')->isGranted('ROLE_ADMIN'))或从树枝模板尝试{% if is_granted('ROLE_ADMIN') %}时,Symfony不会检测到该角色。分析器还告诉我,只有ROLE_USER角色。

这是我的app/config/security.yml文件:

security:
    providers:
        main:
            id: fos_user.user_provider.username

    encoders:
        Site\UserBundle\Entity\User: sha512

    role_hierarchy:
        ROLE_MODERATOR: [ROLE_USER]
        ROLE_ADMIN: [ROLE_MODERATOR]

    firewalls:
        main:
            pattern: ^/
            anonymous: true
            form_login:
                login_path: fos_user_security_login
                check_path: fos_user_security_check
            logout:
                path: fos_user_security_logout
                target: /
            remember_me:
                key: %secret%

        default:
            anonymous: ~

3 个答案:

答案 0 :(得分:1)

看起来你没有清除缓存。尝试清除环境缓存

php app/console cache:clear --env=prod #for prod env

php app/console cache:clear #for dev env

答案 1 :(得分:0)

帮助混淆路人:

如果你在http://symfony.com/doc/current/security/entity_provider.html#create-your-user-entity上遵循了Symfony安全教程,你可能已经实现了这样的方法:

public function getRoles()
{
    return array('ROLE_USER');
}

如果您稍后切换到FOSUserBundle,则可能忘记删除此方法。对我来说,这是(自制)问题,为什么我的用户'角色没有正确加载。

答案 2 :(得分:-1)

如果我没有混淆,那么你在security.yml

中已经排好了
        role_hierarchy:
            ROLE_MODERATOR: [ROLE_USER]
            ROLE_ADMIN: [ROLE_MODERATOR]

描述了您在两个角色中都输入了值

  

ROLE_USER

所以你应该做以下几行

role_hierarchy:
    ROLE_MODERATOR:   [ROLE_USER]
    ROLE_ADMIN:       [ROLE_ADMIN]
    ROLE_SUPER_ADMIN: [ROLE_MODERATOR,ROLE_ADMIN]