2014-09-10 137 views
1

我正在使用Symfony框架与FOS用户包。我使用安全上下文来确定显示哪些菜单项和其他项。Symfony2 - 我可以给匿名用户一个'ROLE_SOMETHING'

$securityContext = $this->get('security.context'); 
if ($securityContext->isGranted($report['Permission'])){ 
    //add the menu item... 
} 

有什么办法给匿名用户一个'ROLE_USER'的安全上下文吗?我已登录用户正常工作。

我尝试添加一行:

role_hierarchy: 
    IS_AUTHENTICATED_ANONYMOUSLY: ROLE_USER 

我security.yml希望这将做到这一点,但显然不是。我搜索了一下并阅读了文档。

我想象:

if ($securityContext->isGranted($report['Permission']) 
    || ($report['Permission'] === 'ROLE_USER' && $securityContext->is_anonymous())) 

会的工作,但这种感觉就像样的黑客(而不是非常DRY)

编辑: 这是一个内部网站。我有一张包含报告名称的表格。不管是否登录,都应该能够看到一些报告。一些报告需要查看权限。我不想创建几百个用户,只有少数用户需要访问。

+0

你想做什么?默认情况下,给予用户角色意味着他需要登录。 – 2014-09-10 15:29:47

+1

您不能这样做,因为伪角色IS_AUTHENTICATED_ANONYMOUSLY仅用于symfony中内置的系统身份验证,以区分未经身份验证的用户在某些路由中输入的内容防火墙。 – 2014-09-10 15:50:55

+1

另一种方法是使用选民:http://symfony.com/doc/current/cookbook/security/voters_data_permission.html。你最终得到:$ securityContext-> isGranted('view',$ report);所有的逻辑结束在你的选民类。 – Cerad 2014-09-10 15:54:14

回答

1

如果您试图将访问权限授予给定的url,为什么不直接授权呢?

你有2个方法来实现这一目标:创建防火墙授权或角色中定义的网址

1)防火墙autorization

firewalls: 
     test: 
      pattern: ^/ws // you url or schema url with regex 
      anonymous: true 

2)的网址与角色定义的访问

access_control: 
     - { path: ^/given-url, roles: IS_AUTHENTICATED_ANONYMOUSLY } 


// in app/config/security.yml 

在这两种情况下,未经过验证的用户和经过验证的用户将有权访问此网址

顺便说一句,如果你想测试(为了显示一些用户变量),如果用户已经验证过了,只要在树枝测试

{% if app.user is defined and app.user not null %} 
     The user {{ app.user.username }} is connected. 
    {% else %} 
     No user connected 
    {% end %} 

编辑:基于内容的观点:中庸之道创建你的行为路线不符合你的防火墙规则

+0

谢谢,但我有这部分工作。我已对该帖子进行了修改。这是内容创作,也是我需要工作的基于角色的内容。 – eidsonator 2014-09-10 15:36:46

+0

像我的编辑,你应该编辑你的内容视图的行动路线到不同的网址,为了不符合你的防火墙规则,然后授予访问该网址给未经过验证的用户 – 2014-09-10 15:43:03

+0

我显然做了一个非常糟糕的工作,解释自己今天。抱歉。我想根据安全上下文在控制器内部作出决定,以决定是否需要将项目添加到传递给我的模板以进行呈现的数组。即报告列表。 – eidsonator 2014-09-10 15:53:28

相关问题