在我的第一个大型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也失败了 - 它看不到用户拥有的角色......
答案 0 :(得分:2)
正如评论中所解释的那样,问题在于角色名称。角色必须以ROLE_
开头。
所以解决方案是设置角色层次精简
ROLE_BLOG_USER: ROLE_USER
所有角色必须以Symfony2管理的ROLE_前缀开头。 如果使用专用的Role类定义自己的角色(更多 高级),不要使用ROLE_前缀。