对资源部分的访问级别控制


Access level control to parts of a resource?

我正在做一个新项目,我想弄清楚我们将要使用的安全级别。起初,我们考虑的是基本的读写权限场景。然后,我们可能不得不限制对部分资源的读访问(有点像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"}

你们知道有什么软件包可以帮助我更有效地实现这个目标吗?

根据你所做的(例如HTML视图或REST应用程序),你可以在symfony中以多种方式完成此操作。

如果是HTML,你可以只使用twig中的角色和开关(这是一个丑陋的方法)

{% if is_granted("ROLE_WITH_EXTRA_FIELDS") %}
{% endif %}

对于rest应用程序,您可以使用更好的方法。JMSSerializer (http://jmsyst.com/libs/serializer)提供了一个包(http://jmsyst.com/bundles/JMSSerializerBundle),它允许您使用排除策略。您可以在控制器级别将它们与角色混合使用,以便仅向具有适当角色的人员公开您想要的数据。

示例取自http://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#creating-different-views-of-your-objects

<?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())的东西调用,只要角色匹配序列化器组,那么它应该按预期工作。