Привет всем, мне нужен совет по этому поводу ...
У нас есть определенные разрешения, настроенные в базе данных для определенных уровней контроля, которые пользователь может иметь над приложением. Отключено, только для чтения и редактирования.
Мой вопрос: есть ли более общие / лучшие способы обработки разрешений, применяемых к элементу формы на странице, чем написание метода безопасности / проверки для каждой страницы, чтобы включить / отключить / скрыть / показать правильные элементы управления в зависимости от разрешенных разрешений?
У кого-нибудь есть опыт обращения с этим по-разному?
Редактировать:
Я просто подумал о возможности добавления констант для каждого уровня, который нуждается в безопасности, а затем добавления функции IsAuthorized в пользовательском классе, которая будет принимать константу из формы, в которой находится элемент управления, и возвращать логическое значение для включения / отключения элементов управления, это будет действительно уменьшите количество мест, которые мне придется ударить, когда / если мне когда-либо понадобится изменить безопасность для всех форм.
Ваше здоровье!





Я думаю, есть больше возможностей, чем вы думаете.
Также вам нужно учитывать множество факторов, которые влияют на принятие решения.
Выполнение? Во-первых, убедитесь, что у вас есть четкое представление о том, как осуществляется жизненный цикл страницы. Моя обычно выглядит примерно так.
Вы можете проверить, как django обрабатывает формы и подтверждает их. Формы обрабатываются как модели, у них есть собственный класс, поэтому их список полей, правила проверки и логика отображения больше не разбросаны по представлению, контроллеру и помощнику. С такой структурой довольно ясно, к чему относится скрытая / только для чтения / редактируемая логика.
Похоже, в рельсах такая возможность пока не реализована. Это не только экономит время, но и сохраняет ваш код чистым и структурированным. Вы можете начать с создания базового класса для форм, где проверка отделена от контроллера.
Извините за то, что здесь немного не по теме, но извлеките уроки из моей ошибки:
Одно время у меня было простое веб-приложение, которое я разрабатывал, и я подумал, что установлю 3 уровня безопасности: ограниченный доступ только для чтения (общедоступный), ограниченный для чтения запись (пользователь), чтение-запись (администратор). В таблице пользователей был уровень безопасности, и все работало нормально ... пока мне не понадобился более точный контроль над уровнями безопасности по мере роста проекта. Все началось с пользователя, которому требовалось больше, чем пользовательский контроль в одной области программы, но не полный административный контроль.
Что мне нужно было сделать, так это настроить расширяемую систему с более точным контролем, хотя сначала мне это не понадобилось. Это сэкономило бы мне ооочень много времени.
Я бы сказал, что это не ваша вина как программиста, вы поступили правильно: самое дешевое решение проблемы. Вы не можете быть обвинены в неполных требованиях - но поскольку кажется, что никто, кроме вас, не собрал эти требования, все, о чем вы можете сожалеть, - это недостаточно настаивать на собеседовании с вашими пользователями ;-)
В этом случае заинтересованной стороной была моя жена. Это была простая база данных для ее веб-сайта. Когда дело касается жены, мы все знаем, на кого падает вина ...;)
Хорошая точка зрения. К счастью, мы установили примерно разрешения уровня управления, а некоторые даже действительно копаются в уровне управления. В итоге я просто добавил метод безопасности к нужным мне страницам. Да, больно, но у меня был ограниченный бюджет времени. Спасибо за комментарий!
Я обнаружил, что для правильной работы уровни доступа должны быть в следующем порядке возрастания: НЕТ, ПРОСМОТР, ТРЕБУЕТСЯ, РЕДАКТИРОВАТЬ.
Обратите внимание, что ТРЕБУЕТСЯ НЕ является верхним уровнем, как вы могли подумать, поскольку РЕДАКТИРОВАНИЕ (разрешение на заполнение и удаление) является большей привилегией, чем ТРЕБУЕТСЯ (разрешение только на заполнение).
Перечисление будет выглядеть так:
/** NO permissions.
* Presentation: "hidden"
* Database: "no access"
*/
NONE(0),
/** VIEW permissions.
* Presentation: "read-only"
* Database: "read access"
*/
VIEW(1),
/** VIEW and POPULATE permissions.
* Presentation: "required/highlighted"
* Database: "non-null"
*/
REQUIRED(2),
/** VIEW, POPULATE, and DEPOPULATE permissions.
* Presentation: "editable"
* Database: "nullable"
*/
EDIT(3);
Из нижнего слоя (ограничения базы данных) создайте карту полей для доступа. Затем эта карта обновляется (дополнительно ограничивается) на следующем уровне (бизнес-правила + права пользователя). Наконец, верхний слой (правила представления) может при желании снова ограничить карту.
Важное замечание: карта должна быть обернута так, чтобы разрешать доступ только через уменьшился с любым последующим обновлением. Обновления, которые пытаются расширить доступ, следует просто игнорировать, не вызывая ошибок. Это потому, что он должен действовать как система голосования по вопросу о том, как должен выглядеть доступ. По сути, последующее наслоение уровней доступа, как упомянуто выше, может происходить в любом порядке, поскольку это приведет к отметке низкого уровня доступа для каждого поля после того, как все слои проголосуют.
Разветвления:
1) Уровень представления МОЖЕТ скрыть поле (установить доступ на NONE) для поля, заданного базой данных и предназначенного только для чтения (VIEW).
2) Уровень представления НЕ МОЖЕТ отображать поле, если в бизнес-правилах указано, что у пользователя нет доступа как минимум на ПРОСМОТР.
3) Уровень представления НЕ МОЖЕТ переместить доступ к полю до «редактируемого» (допускающего значение NULL), если в базе данных указано, что он только «обязательный» (не допускающий значение NULL).
Примечание. Уровень представления должен быть создан (настраиваемые теги отображения) для отображения полей путем чтения карты доступа без необходимости использования каких-либо операторов «если».
Та же карта доступа, которая используется для настройки отображения, также может использоваться во время проверки отправки. Универсальный валидатор может быть написан для чтения любой формы и ее карты доступа, чтобы гарантировать соблюдение всех правил.
(Также см. Ветку: Рекомендации по контролю доступа к полям формы)
Этот проект немного проще, чем та глубина, в которую вы погружаетесь. На самом деле у нас есть три роли, которые пользователь может иметь на каждой странице сайта. Я хочу увидеть, какие другие параметры доступны для динамического / общего назначения этих разрешений всем полям формы. Спасибо за ответ.