1

Тема: Посоветуйте ACL бандл с группами

Необходимо разграничить права доступа в проекте. Достаточно стандартные потребности:

1. Создание групп пользователей (роли).
2. Ограничение на уровне групп + понятие "владелец" сущности.
3. Управление правами групп из панели. Здесь, наверное, точнее будет сказать, что права нужно читать из базы. Сохранять их туда - отдельная история.
4. Работа по принципу:

if ($acl->isGranted('edit', $entity)) {
...
}

Я смотрел несколько бандлов, но из документации не совсем понял, способны ли они на то, что мне требуется. Узким местом становятся группы. Вероятно, можно взять какой-то бандл и кастомизировать его под свои нужды, но я серьезно боюсь задач такого плана, так как с симфонией пока знаком очень плохо.

Собственно вопрос в том, какой бандл из существующих максимально близок к тому, что мне нужно. Не исключаю, что я мог пропустить нужный или просто сделать неверные выводы. Ожидаю мнения того, кто реализовывал нечто близкое к моей задаче и может рекомендовать использованные инструменты. Еще больше буду признателен за какие-нибудь полезные ссылки.

2

Re: Посоветуйте ACL бандл с группами

http://symfony.com/doc/current/cookbook … y/acl.html
http://symfony.com/doc/current/cookbook … anced.html
https://github.com/FriendsOfSymfony/FOSUserBundle

Встроенный в Symfony ACL прекрасно справляется с этой задачей, можно давать одним обьектам права над другими.
Устанавливаете fos-user и настраиваете группы, которым уже можно давать права через ACL.

Весело тут у вас.

3

Re: Посоветуйте ACL бандл с группами

FOS я смотрел и где-то читал комментарии о том, что с ростом системы (бд) он начинает проседать на производительности. Насколько я понял, он для каждой сущности сохраняет в бд информацию о правах  (владелец и т.п). База растет  и растет время обработки sql запросов. Это так?
Для меня этот вопрос важен, так как я занимаюсь разработкой системы документооборота и большая часть таблиц будет иметь огромное количество записей.

Документацию про ACL я читал конечно же. Насколько я понимаю, FOS не дополняет родной ACL, а предлагает полностью свой?

4

Re: Посоветуйте ACL бандл с группами

Плохо вы читали, FOS не имеет никакого ACL вовсе.

Весело тут у вас.

5

Re: Посоветуйте ACL бандл с группами

Я не писал, что хорошо читал про FOS. Я читал про ACL (2 первых ссылки из вашего списка). Ситуация с FOS для меня пока не ясна.
Вы можете сказать что-нибудь по существу?

6

Re: Посоветуйте ACL бандл с группами

0mm пишет:

Вы можете сказать что-нибудь по существу?

А что вы хотите услышать по существу, собственно?
Какой из существующих бандлов лучше всего подходит к вашей задаче? FOSUser вам вроде предложили. Или вы ждете подробного разбора существующих бандлов (не уверен, что тут есть хоть один человек, который видел все существующие бандлы, причем не просто видел, а копался внутри каждого) с графиками и таблицами?

FOSUser, собственно, единственный вменяемый, известный, и, как следствие, достаточно протестированный бандл для управления пользователями. 99% остальных нужны только их создателям. Что конкретно вы хотите сравнивать в этом контексте?

Насколько FOSUser подходит к вашей задаче и какой процент изменений понадобится - это уже, извините, исключительно ваша задача, как программиста, и никто ее за вас решать не будет. Бандл - это не готовое решение, это средство разработки. Что захотите из него - то и вылепите, как сумеете - так и выйдет.

0mm пишет:

читал комментарии о том, что с ростом системы (бд) он начинает проседать на производительности

99% решений с увеличением объема начинает проседать на производительности. Это - нормально. Для этого есть такая часть работ, как оптимизация решения/схемы данных под ваши индивидуальные задачи. Которую должен решать программист/архитектор проекта. Ни один сторонний бандл, рассчитанный на сколько-нибудь массовое использование, не сможет «искаропки» предоставить оптимальное решение именно вашей задачи.

7

Re: Посоветуйте ACL бандл с группами

Чего вы все такие агрессивные?
Я в своем посте вполне четко описал проблемы, которые меня волнуют: производительность и сложность/простота кастомизации. Причем спрашивал именно про FOS. Разве это просьба провести обзор всех возможных бандлов или дать готовое решение? Я лишь пытаюсь локализовать зону поиска того, что мне нужно и найти правильный вектор.

Про кастомизацию не совсем согласен. Несмотря на скромный опыт работы с Symfony 2 встречал очень разные бандлы: одни настраиваются вдоль и поперек вполне нативными средствами. Другие проще выкинуть, чем допилить. Тот, кто плотно работал с упомянутым FOS, вероятно, сможет отнести его к той или иной категории.

8

Re: Посоветуйте ACL бандл с группами

0mm пишет:

Собственно вопрос в том, какой бандл из существующих максимально близок к тому, что мне нужно.

0mm пишет:

Разве это просьба провести обзор всех возможных бандлов

Вы таки определитесь, о чем вы спрашиваете.

0mm пишет:

одни настраиваются вдоль и поперек вполне нативными средствами. Другие проще выкинуть, чем допилить.

Я думаю, должно быть очевидно, что если бы FOSUser относился ко второй категории, он не имел бы такой популярности, а был бы как раз в числе тех 99%, которые используются в лучшем случае в 1-3 проектах их создателей.

Собственно, на все ваши вопросы так или иначе уже ответили. Если вас интересует стабильный, поддерживаемый и оттестированный бандл, то это FOSUser. Вопросы производительности вам придется решать оптимизацией в индивидуальном порядке, когда возникнет проблема. Что касается всех остальных бандлов управления пользователями, то подавляющее большинство оных никто не знает, и ничего соответственно вам про них не расскажет.

Re: Посоветуйте ACL бандл с группами

0mm пишет:

1. Создание групп пользователей (роли).
2. Ограничение на уровне групп + понятие "владелец" сущности.
3. Управление правами групп из панели. Здесь, наверное, точнее будет сказать, что права нужно читать из базы. Сохранять их туда - отдельная история.
4. Работа по принципу
if ($acl->isGranted('edit', $entity)) {
...
}

Стандартные механизмы Symfony - хороший выбор под эту задачу.

0mm пишет:

FOS я смотрел и где-то читал комментарии о том, что с ростом системы (бд) он начинает проседать на производительности. Насколько я понял, он для каждой сущности сохраняет в бд информацию о правах  (владелец и т.п). База растет  и растет время обработки sql запросов. Это так?

Это так и это не так. База, конечно, растёт. Фрагментация этих данных тоже растёт. Голые запросы к БД, конечно, становятся несколько медленнее. Но у документов есть особенность: чем они старее, тем реже ими пользуются. Таким образом, задачу оптимизации великолепно выполнит простой кеш + размещение индексов в памяти.

И да, проседание производительности не связано с ACL Symfony или особенностями реализации FOS. Любая реляционная схема хранения таких данных будет проседать на больших объёмах с той же эффективностью. Соответственно, если проблема производительности для Вас существенна и не решается кешированием, то вам нужно думать не о выборе бандла, а о переходе с SQL-решений на не-SQL. Например, на Монгу и хранить ACL прямо в полях в документа.

10

Re: Посоветуйте ACL бандл с группами

Странник пишет:

Например, на Монгу и хранить ACL прямо в полях в документа.

С одной лишь оговоркой.
Если нужна надежность/безопасность, при этом документы могут иметь совместный доступ, то Монга уже не вариант - задолбаетесь реализовывать транзакционность. Лучше оптимизировать модель, строить схемы данных и управляющую логику, наиболее быстро выполняющие нужные задачи. Кешировать права доступа (но осторожно, особенно если нужна высокая безопасность). Вообще, реляционная модель при правильном подходе работает очень быстро, а с данным типом задач - еще и намного более надежно, в сторону nosql смотреть совсем не обязательно.

11

Re: Посоветуйте ACL бандл с группами

Всем спасибо за ответы.
Что касается моих переживаний о производительности, то, наверное, я неверно выразился изначально. Ситуация с реляционными хранилищами мне ясна, определенно. Просто на  одном из форумов я видел замечание о том, что у FOS падает быстродействие по мере роста системы. Это было преподнесено так, будто это первая проблема, с которой придется столкнуться и чуть ли не сразу. Вероятно, автор несколько преувеличил, а я повелся default/smile

Стандартные механизмы Symfony - хороший выбор под эту задачу.

Я уже думал над этим - написать свой небольшой сервис, который решит данную задачу. Но очень не хочу велосипедить, особенно учитывая то, что мой опыт пока крайне мал и, скорее всего, получится велосипед без колес.

12

Re: Посоветуйте ACL бандл с группами

Еще раз всем спасибо за ответы. Подключил ACL, написал свой небольшой менеджер по выдаче прав ролям.

В контроллерах все чудесно работает

if (!$securityContext->isGranted('VIEW', new ObjectIdentity('class', 'App\\MyBundle\\Entity\\MyEntity'))) {
            throw new AccessDeniedException();
        }

Но я никак не могу понять, каким образом аналогичную конструкцию использовать в twig шаблонах. То есть имеется основное меню приложения, в котором я хочу скрывать те или иные пункты, в зависимости от возможностей роли пользователя.

Подскажите, куда копать. спасибо.

13

Re: Посоветуйте ACL бандл с группами

Через написание экстеншена для Твига.
http://symfony.com/doc/2.2/cookbook/tem … nsion.html

14

Re: Посоветуйте ACL бандл с группами

Да, спасибо. Как раз только что сообразил, что можно свой is_granted написать, в котором создавать ObjectIdentity()

15

Re: Посоветуйте ACL бандл с группами

Зачем же его писать, если он и так есть?

https://github.com/symfony/symfony/blob … ension.php

Весело тут у вас.

16

Re: Посоветуйте ACL бандл с группами

Да, есть isGranted. Но я так и не понял, как мне передать в него создаваемый "на лету" объект ObjectIdentity(), поэтому пришлось свой экстеншен добавить.