Вопрос

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

Я могу написать в каждом методе:

if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}

Я думал о автоматизации этого процесса, например, добавив атрибуты этим методам или, возможно, любое другое решение?

Это было полезно?

Решение

Взгляните на библиотеки «Aspect ориентированного программирования» (AOP) - и ответы на Этот вопрос стойкиОтказ Вы можете использовать AOP, чтобы добавить код проверки роли автоматически.

Другие советы

Пока вы используете принципалы, вещи уже есть ...

[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
  // Will throw an exception if the principal does not have the required role
  // Otherwise the method will execute normally
}

Сделайте проверку один раз в строгое время, и бросьте (или возвращайте NULL с завода), если условие безопасности не выполнено. После этого удерживая ссылку на заданный объект модели, достаточно доказательств того, что вы проходили проверку безопасности в какой-то более ранней точке. Если вы беспокоитесь, что это может вызвать Аккуратность Проблемы, убедитесь, что эти объекты становятся непригодными для использования в конце определенной приложении концепции «Игровой поворот» (обычно транзакция базы данных); Это хорошая практика в любом случае.

Этот подход безопасности называется способность дисциплина. Отказ Подумайте о своих объектах как коробки, которые имеют Некоторые авторитеты внутри них (в их частных переменных). Нажав кнопки на коробке, вы можете управлять адаптерной долей этой власти только в том, что программатор объекта позволяет вам.

Например, скажем, вы пишете календарь приложение с Backend SQL. Здесь SQLTransaction Объект, который не переживает транзакцию (согласно выше), но все же он имеет все права на все таблицы, которые использует приложение. Это большая сила, которую вы не хотите, чтобы вы ни переезжали к пользователям вашей API (явно или по ошибке, думают, что SQL Inurge). Вместо этого вы раздаете User объекты, которые моделируют полномочия для записи только к строке пользователя в таблице пользователей; также User может создать, прочитать, обновлять, удалить Appointment Объекты, которые аналогично представляют ограниченную власть в таблице назначения.

Чтобы поддерживать RBAC по всему вашему API, вы должны убедиться, что следующее удержание:

  1. Только законные пользователи могут получить доступ к User объект, который представляет их. Это где вы проводят систему аутентификации в User конструктор;
  2. То User объекты нет Утечка власти, т.е. вы должны проверить вашу API, чтобы убедиться, что, осуществляя метод звонков на User (или любой связанный объект, который они возвращают, рекурсивно) вы не можете прочитать или изменить любые ресурсы, которые не принадлежат этому пользователю. Это где вы можете применить аспект Узор - например, User.GetAppointments() возвращает реальность Appointment Экземпляры для назначений, созданных этим пользователем, но обертки только для чтения для тех, кто создан кем-то еще.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top