我正在开展一个新项目,我正试图找出我们将要使用的安全级别。起初我们想到了一个基本的读取,写入权限场景。然后它出现了,我们可能将不得不限制对部分资源的读取访问权限(Facebook的权限类型 - 电子邮件,user_about_me,user_birthday等...)。
我们考虑过类似:user_basic,user_contact
因此,如果你只有user_basic,你会得到类似:{id:1,name:“Tom”,lastName:“Doe”}
如果你有两个,你会得到:{id:1,名字:“Tom”,lastName:“Doe”,电话:“123-123-1234”,地址:“123 fake street”}
你们知道有哪些套餐可以帮我更有效地实现这个目标吗?
答案 0 :(得分:1)
根据您正在做的事情(例如HTML视图或REST应用程序),您可以在symfony中以多种方式执行此操作。
如果是HTML,你可以在twig中使用角色和开关(这是一种丑陋的方法)
{% if is_granted("ROLE_WITH_EXTRA_FIELDS") %}
{% endif %}
对于休息应用程序,您可以使用更好的方法。 JMS Serializer(http://jmsyst.com/libs/serializer)提供了一个包(http://jmsyst.com/bundles/JMSSerializerBundle),可让您使用排除策略。您可以在控制器级别混合使用角色,只向具有适当角色的人员公开您想要的数据。
的示例<?php
use JMS\Serializer\Annotation\Groups;
class BlogPost
{
/** @Groups({"list", "details"}) */
private $id;
/** @Groups({"list", "details"}) */
private $title;
/** @Groups({"list"}) */
private $nbComments;
/** @Groups({"details"}) */
private $comments;
private $createdAt;
}
在你的控制器的动作中,有一点像这样:
use JMS\Serializer\SerializationContext;
$serializer->serialize(new BlogPost(), 'json', SerializationContext::create()->setGroups(array('list')));
//will output $id, $title and $nbComments.
$serializer->serialize(new BlogPost(), 'json', SerializationContext::create()->setGroups(array('Default', 'list')));
//will output $id, $title, $nbComments and $createdAt.
您可以使用类似setGroups($user->getRoles())
的内容进行调用,只要角色与序列化程序组匹配,就可以按预期工作。