Построение структуры JSON для хранения правил для веб-запросов - PullRequest
2 голосов
/ 08 сентября 2010

Я пытаюсь сохранить правила для веб-запросов в объекте JSON, и у меня возникают проблемы с представлением хорошей структуры.Вот несколько примеров моих правил:

Возможные условия

the user must be logged in
the user must belong to an account of type [____]
the user must belong to an account named [___]
the user must have a username [___]
the user must have the account role [___]
the current time must be between [___] and [___]
the variable [___] must be set to [___]

Возможные успешные действия

allow access to the requested view
redirect to download a specific file

Возможные действия при сбое

redirect to a certain view to display reasons why access was denied
redirect to a purchase page
redirect to a login page with a notice explaining why access was denied

Мне нужно хранить несколько правил в одном объекте.Мне также нужно иметь возможность хранить логические отношения, как это:

(rule1 && rule2) || rule3

Структура объекта обычно мне легко дается, но я изо всех сил пытаюсь это собрать.Вот пример требования, которое должен хранить объект JSON:

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

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Проверьте Amazon S3 Bucket Policies, отвечающие всем требованиям. Это уже в формате JSON. Попробуйте расширить Условия своими собственными и расширить действия Эффекта, включив в них сообщение.

http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?AccessPolicyLanguage.html

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

1 голос
/ 08 сентября 2010

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

В действительно простом формате могут использоваться битовые маски (популярные в программировании Windows API :). Вы можете даже передавать их между клиентской и серверной сторонами в виде простой строки. В какой-то момент количество правил может стать громоздким. Одна из наших систем в магазине на самом деле использует механизм бизнес-правил из-за огромного количества вариантов выбора.

Вот небольшой фрагмент, который должен вывести двоичную строку: 1010001

<!DOCTYPE html>
<html><head><title>Bitmask</title></head>
<body>

<div id="output"></div>
<script type="text/javascript">
var out = document.getElementById('output');

var R_IS_LOGGED_IN    = 1;
var R_HAS_ACCT_TYPE_X = 2;
var R_HAS_ACCT_TYPE_Y = 4;
var R_HAS_USER_NAME   = 8;
var R_HAS_ROLE_X      = 16;
var R_HAS_ROLE_Y      = 32;
var R_VAR_X_IS_A      = 64;
var R_VAR_X_IS_B      = 128;

var attrs_as_string = 
  (R_IS_LOGGED_IN | R_HAS_ROLE_X | R_VAR_X_IS_A).toString(2);

out.innerText = attrs_as_string;
</script>
</body>
</html>

Затем вы можете предварительно вычислить желаемые комбинации условий и, возможно, использовать простой подход таблицы коммутации / отправки:

switch(computed_bitmask) {
  case '11001' : do_this(); break;
  case '1101'  : do_that(); break;
  default: do_whatever();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...