Symfony2使用event_subscriber和FOSUser bundle注册到用户帐户后添加角色

时间:2013-08-13 01:18:38

标签: php symfony fosuserbundle

在我的第一个大型Symfony2项目上工作,我在抓住事件监听器/订阅者正在发生的事情时遇到了一些麻烦。

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

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

注册听众:

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);
    }
}

services.yml:

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

security.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也失败了 - 它看不到用户拥有的角色......

1 个答案:

答案 0 :(得分:2)

正如评论中所解释的那样,问题在于角色名称。角色必须以ROLE_开头。 所以解决方案是设置角色层次精简

ROLE_BLOG_USER: ROLE_USER

来自documetation

  

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

相关问题