1

在我的第一个大型 Symfony2 项目上工作,我在掌握事件侦听器/订阅者的情况时遇到了一些麻烦。

我希望有一个事件订阅者在用户注册他们的帐户后将角色 (BLOG_USER) 添加到 FOSUser 实体。

这是我到目前为止所得到的:

注册监听器:

namespace MyBlog\SiteBundle\EventListener;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class RegistrationListener implements EventSubscriberInterface {
    public static function getSubscribedEvents() {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
        );
    }
    public function onRegistrationSuccess(FormEvent $event){
        $rolesArr = array('ROLE_USER', 'BLOG_USER');

        $user = $event->getForm()->getData();
        $user->setRoles($rolesArr);
    }
}

服务.yml:

services:
    myblog_user.registration_listener:
        class: MyBlog\SiteBundle\EventListener\RegistrationListener
        arguments: []
        tags:
            - { name: kernel.event_subscriber }

安全性.yml:

access_control:
    - { path: ^/blog/, role: BLOG_USER }

到目前为止,当我注册一个新用户时,他们无法访问 /blog 路由(这是一组 CRUD 屏幕) - 我收到一条“拒绝访问”消息,对于没有 BLOG_USER 角色的用户来说,这是预期的。

编辑:

我的代码似乎确实将角色添加到数据库中的用户。在角色下的 fos_user 表中,我的用户有这个:

a:1:{i:0;s:9:"BLOG_USER";}

但是,似乎我的 access_control 没有看到这一点。

 {% if is_granted('BLOG_USER') %}

is_granted 也失败了——它看不到用户拥有的角色......

4

1 回答 1

2

正如评论中所解释的,问题出在角色名称上。角色必须以ROLE_. 所以解决方案是设置角色层次结构精简版

ROLE_BLOG_USER: ROLE_USER

文档中引用

所有角色都必须以 ROLE_ 前缀开头,才能由 Symfony2 管理。如果您使用专用 Role 类(更高级)定义自己的角色,请不要使用 ROLE_ 前缀。

于 2013-08-13T05:31:15.903 回答