对资源的某些部分进行访问级别控制?

时间:2016-06-28 19:41:28

标签: php symfony

我正在开展一个新项目,我正试图找出我们将要使用的安全级别。起初我们想到了一个基本的读取,写入权限场景。然后它出现了,我们可能将不得不限制对部分资源的读取访问权限(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”}

你们知道有哪些套餐可以帮我更有效地实现这个目标吗?

1 个答案:

答案 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),可让您使用排除策略。您可以在控制器级别混合使用角色,只向具有适当角色的人员公开您想要的数据。

取自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())的内容进行调用,只要角色与序列化程序组匹配,就可以按预期工作。