2016-06-28 2 views
1

Я нахожусь в новом проекте, и я пытаюсь выяснить уровень безопасности, который мы будем использовать. Сначала мы подумали о базовом сценарии чтения, записи разрешений. Затем выяснилось, что нам, вероятно, придется ограничить доступ для чтения к частям ресурсов (вроде того, что делает Facebook с разрешениями - электронная почта, user_about_me, user_birthday и т. Д.).Контроль уровня доступа к частям ресурса?

Мы думали о чем-то вроде: user_basic, user_contact

Так что если у вас есть только user_basic вы получите что-то вроде: {ID: 1, имя: "Том", LastName: "Doe"}

Если у вас есть оба, вы получите: {id: 1, имя: «Tom», lastName: «Doe», телефон: «123-123-1234», адрес: «123 fake street»}

Вы ребята знают какие-то пакеты, которые помогают мне достичь этого более эффективно?

+0

Если мой ответ работает на вас, проголосуйте за него как лучший ответ, чтобы я мог получить больше репутации и помочь другим. Спасибо и удачи! – vpassapera

ответ

1

В зависимости от того, что вы делаете (например, HTML-представление или приложение REST), вы можете сделать это несколькими способами в symfony.

Если HTML, вы можете просто использовать роли и переключатели в прута (это некрасиво подход)

{% 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; 
} 

в действии что-то вашего контроллера likle это:

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()) и до тех пор, как роли совпадают сериализатором группы, то это должны работать должным образом.

Смежные вопросы