В видео, которое я разместил в своем комментарии, есть идеи, схожие с теми, которыми вы поделились, но без кода.
Что касается вашего вопроса, я никогда не реализовывал это, и у меня есть только смутное представление о том, как такая система может (или не может) быть построена, поэтому принимает мой вклад с (или несколькими) фрагментами. соли .
Первое, что вы должны сделать, это определить ограничения, которые пользователь может ограничить, забыть о произвольных данных, определение того, что пользователь может и не может определить, является наиболее важным моментом здесь.
Следующим шагом является определение какой-либо системы обозначений или структуры данных, которую можно легко проанализировать и проверить, например, с учетом ограничений по времени у вас есть следующие возможности:
- конкретные даты (2011-05-26)
- диапазоны даты и времени (с 2011-05-26 по 2011-05-31)
- рекурсивные даты (201x-05-26 или каждая пятница)
- логические (и / или / xor) операторы
Если у вас есть нотация с проппером, вы можете легко проанализировать и проверить это с помощью токенизации правила и, возможно, используя что-то DatePeriod или DateInterval или даже оператор модуля как делает crontab.
Ваш второй пример:
Разрешить только данной группе вызывать
обработчик для изменения «собственных» данных; то есть:
данные, созданные ассоциированным пользователем.
Для меня звучит как простой ACL:
- ресурс: конкретные данные
- роль: конкретный пользователь
Тогда, конечно, у вас есть более сложные правила, такие как:
Пользователь, который утверждает запись, должен
иметь равный или более высокий уровень (в
то же пространство имен безопасности), что и у пользователя
кто создал запись, но они не могут
будь тем же пользователем.
Я думаю, что такого рода правила должны быть специфичны для логики приложения, и настоящее универсальное решение будет чрезвычайно сложно реализовать, - сказал Зед Шоу в своем выступлении, предлагая полное решение, которое использует только 400 строк кода, Мне было бы очень интересно узнать, как он это сделал.
Флаги (хранящиеся в битах) являются отличным (хотя и загадочным) способом определения комбинации одного или нескольких ограничений, но, по моему опыту, лучше, если вы определите все ограничения apriori.
Поскольку вы, похоже, не знаете точно, какие ограничения вы хотите проверить, я предлагаю вам создать нотацию для нескольких типов ограничений, которые вы хотите проверить:
- по времени
- на основе пользователя / ресурса
- ...
И затем реализовать методы, которые анализируют (возможно, с помощью обозначения, которое подразумевает версию, чтобы вы могли выполнить миграцию в будущем) и проверяют все ограничения.
Извините, если мой ответ не очень вам поможет, но я нахожу вопрос очень интересным, и я надеюсь, что кто-то другой придумал лучший, AFAIK, у нас нет волшебной палочки, чтобы сделать это.