Symfony2 FosUserBundle 角色 ROLE_ADMIN

Posted

技术标签:

【中文标题】Symfony2 FosUserBundle 角色 ROLE_ADMIN【英文标题】:Symfony2 FosUserBundle Roles ROLE_ADMIN 【发布时间】:2014-06-05 12:41:47 【问题描述】:

我遇到了这个问题。

已经用 FosUserBundle 和 FacebookBundle 配置了我的 Sf2 环境。

我已经设法在前端的一些仅限管理员的部分(意思是主持人的事情)。 默认情况下,在我的项目中创建的每个用户都只有 ROLE_USER。

只有通过 ROLE_ADMIN 才能访问“主持人”。问题是即使我通过“$user->addRole('ROLE_ADMIN')”添加角色,检查用户是否具有此角色失败。 如果用户有这种角色,我想展示一些东西,但我不能。

% if is_granted('ROLE_ADMIN') %”都不是, 也没有“$this->container->get('security.context')->isGranted('ROLE_ADMIN')”成功。

每当谈到 TWIG 时,我都会得到 FALSE 或什么都没有。

检查用户是否有 ROLE_USER 工作。

只是为了确保我正在添加我的配置内容。

security:
encoders:
    FOS\UserBundle\Model\UserInterface: sha512
    Symfony\Component\Security\Core\User\User: plaintext

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
    chain_provider:
        chain:
          providers: [fos_userbundle, my_fos_facebook_provider]
    fos_userbundle:
        id: user_provider
    my_fos_facebook_provider:
        id: my.facebook.user


firewalls:
    public:
        pattern: ^/
        form_login:
            login_path: /login
            check_path: /login_check
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            use_referer: true
        fos_facebook:
            app_url: "http://www.facebook.com/apps/application.php?id=APPID"
            server_url: "http://l.local/app_dev.php/"
            login_path: /login
            check_path: /login_fb_check
            default_target_path: /
            provider: my_fos_facebook_provider
            use_referer: true
        logout:
            path:   /logout
            invalidate_session: false
        anonymous:    true

access_control:
    -  path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/admin/, role: ROLE_ADMIN 
    -  path: ^/secured/.*, role: IS_AUTHENTICATED_FULLY 
    -  path: ^/facebook/,  role: [ROLE_FACEBOOK] 
    -  path: ^/dodaj$, role: ROLE_USER 
    -  path: ^/.*, role: [IS_AUTHENTICATED_ANONYMOUSLY] 

请,如果有人可以提供帮助,因为我不知道该怎么做。

我一直在检查以确保我的角色(“ROLE_ADMIN”)是否已添加到我的数据库中,事实上,确实如此。

【问题讨论】:

1.您是否坚持($userManager->updateUser($user) 用户对象?2. 您是否在与$user->addRole() 相同的请求中或在下一个请求中进行角色检查? 嗯,我做到了。 ($user->save()) 我在保存用户后检查了角色。这有点奇怪.. 我不知道这是否是常见的事情,但即使我的数据库中的角色位置为 NULL,当我执行$user->getRoles() 时,我也会得到 ROLE_USER。我知道这可能是任何人的默认角色,但实际上问题在于 ROLE_ADMIN。 请务必重新登录以申请角色。我从来不明白我们需要那个。 好的,这是我真正还没有做过的事情。请让我正确理解,当我将某个角色应用于用户(我自己的角色)并在控制器或树枝中检查该角色时,我只是在检查字符串,对吗?没有必要做一些其他的配置吗? 【参考方案1】:

角色是会话生成时的进程(连接、登录……)。所以你从安全上下文(会话)中得到它。直接在树枝模板中或从其他地方的 securityContext 对象中:

在树枝模板中使用is_granted('ROLE_ADMIN')

在控制器中(带有安全上下文)使用$securityContext->isGranted('ROLE_ADMIN')

不要忘记在角色更改后重新签名。

【讨论】:

您的管理员用户的角色字段看起来像 a:1:i:0;s:10:"ROLE_ADMIN"; 吗? 对不起,我看不懂这种写法。 a:1:i:0;s:10:"ROLE_ADMIN"; 是什么我从来没见过。 仅供参考:此符号是序列化以存储在数据库中的角色数组。 更新我的答案还不够? 但是我应该怎么做才能不重新签署用户?

以上是关于Symfony2 FosUserBundle 角色 ROLE_ADMIN的主要内容,如果未能解决你的问题,请参考以下文章

带有 FOSUserBundle 的 Symfony2 - 如何向我的应用程序添加没有层次结构的角色

Symfony2:如何实现自定义用户登录和注册——摆脱 FOSUSerBundle

在 FOSUserBundle 中清除组和角色的使用

在使用 FOSUserBundle 进行用户注册期间添加默认角色

Symfony2 在 Twig 中获取用户角色

Symfony2:FOSUserBundle 删除操作错误