2015-05-02 2 views
7

Я реализующий RESTful сервис, который имеет модель безопасности, требующую авторизации на трех уровнях:Обеспечение авторизации propertly уровня в домене объекты

  1. ресурсы авторизации Уровень - определения того, имеет ли пользователь доступа к ресурсу (сущность). Например, имеет ли текущий пользователь разрешение на просмотр клиентов в целом. Если нет, , тогда все останавливается.
  2. Регистрация уровня экземпляра - определение того, имеет ли пользователь доступ к определенному экземпляру ресурса (объекта). Из-за различных правил и состояния объекта, текущий пользователь может не получить доступ к одному из клиентов в пределах набора клиентов. Например, клиент может просматривать свою информацию, но не информацию другого клиента.
  3. Права собственности - определить, какие свойства у пользователя есть доступ к экземпляру ресурса (объекта). У нас есть много бизнес-правил , которые определяют, может ли пользователь видеть и/или изменять отдельные свойства ресурса (объекта). Например, текущий пользователь может видеть имя клиента, но не свой адрес или номер телефона , а также возможность просмотра и добавления заметок.

Внедрение разрешения на уровне ресурса прямолинейно; однако, другие два не являются. Я полагаю, что решение для авторизации на уровне экземпляра покажет себя с решением (более жестким, imo) вопросом авторизации на уровне собственности. Последняя проблема осложняется тем фактом, что мне нужно передать решения авторизации по свойству в ответном сообщении (ala hypermedia) - другими словами, это не то, что я могу просто обеспечить в установщиках свойств.

С каждым запросом к службе я должен использовать текущую информацию пользователя для выполнения этих проверок авторизации. В случае запроса GET для списка ресурсов или отдельного ресурса мне нужно указать уровень API, который атрибуты текущего пользователя могут видеть (видимо), и доступен ли атрибут только для чтения или редактируется. Затем слой API будет использовать эту информацию для создания соответствующего ответного сообщения. Например, любое свойство, которое не отображается, не будет включено в сообщение. Свойства только для чтения будут помечены так, чтобы клиентское приложение могло отобразить свойство в соответствующем состоянии для пользователя.

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

ПРИМЕЧАНИЕ. Имейте в виду, что это выходит за рамки безопасности на основе ролей, поскольку я получаю окончательный результат авторизации на основе бизнес-правил, используя текущее состояние ресурса и среды (наряду с проверкой доступа с использованием разрешений, предоставленных текущий пользователь через их роли).

Как я должен моделировать домен, поэтому у меня есть применение всех трех типов проверок авторизации (проверяемым способом, с DI и т. Д.)?

+2

Правила авторизации на самом деле не принадлежат к домену, если только это не выражено в терминах домена. Например. 'деактивировать (менеджер менеджера)'. Кроме того, DDD - это все о реальном поведении, а не CRUD. Если у вас есть сеттеры для каждой отдельной проблемы, то DDD является неправильным решением для вашего домена или вы неправильно настроили свой домен. Поэтому вместо того, чтобы смотреть на защиту данных на уровне собственности для записей, вы должны изучать защиту бизнес-операций. – plalx

+0

Я согласен с вами в том, что наши объекты домена должны быть изменены только с помощью методов. Мой вопрос фактически имеет меньше общего с изменением объекта и более того, как использовать правила для создания соответствующего представления объекта. – SonOfPirate

+0

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

ответ

0

Исходные Предположения

Я предполагаю следующую архитектуру:

         Stateless Scaling           Sharding 
              .              . 
              .              . 
              .              . 
         +=========================================+ 
         | Service Layer       | 
+----------+    | +-----------+  +---------------+ |       +------------+ 
|   | HTTP  | |   |  |    | | Driver, Wire, etc. |   | 
| Client | <============> | RESTful | <====> | Data Access | <=======================> | Database | 
|   | JSON  | | Service | DTO |  Layer  | |  ORM, Raw, etc.  |   | 
|   |    | |   |  |    | |       |   | 
+----------+    | +-----------+  +---------------+ |       +------------+ 
         +=========================================+ 
              .              . 
              .              . 
              .              . 

Сначала, давайте предположим, что вы аутентичности Client с Service Layer и получить конкретный маркер, который кодирует аутентификацию и информацию авторизации.

Прежде всего, я прежде всего должен обработать все запросы, а затем фильтровать их только в зависимости от авторизации. Это упростит и упростит работу. Однако, конечно, могут потребоваться некоторые запросы, требующие дорогостоящей обработки, и в этом случае этот подход абсолютно неэффективен. С другой стороны, запросы с большой нагрузкой, скорее всего, будут связаны с доступом к ресурсу, который, как вы сказали, легко организовать, и можно определить и разрешить в Service Layer по адресу API или не менее Data Access.

Дальнейшие мысли

Что касается например и свойство авторизации на уровне, я даже не буду пытаться поставить его в Data Access Layer и будет полностью изолировать его за пределы уровня API, то есть начиная с Data Access Layer нет любой слой даже знал бы об этом. Даже если вы запросите список объектов 1M и хотите испустить одно или два свойства из всех объектов для этого конкретного клиента, было бы предпочтительнее извлечь все объекты, а затем скрыть свойства.

Другое предположение, что ваша модель является явным DTO, т.е. просто контейнер данных, и все бизнес-логика реализована в Service Layer, особенно API уровень. И скажите, что вы передаете данные через HTTP, закодированные как JSON. Так или иначе, где-то перед слоем API, у вас будет небольшая стадия сериализации, чтобы преобразовать вашу модель в JSON. Таким образом, этот этап - это то место, где я думаю, является идеальным местом для размещения экземпляра и разрешения собственности.

Предложение

Если дело доходит до разрешения уровня собственности, я думаю, что нет никакого разумного способа изолировать модель от логики безопасности. Будь то авторизация на основе правил, на основе ролей или на основе, этот процесс будет проверяться по части стоимости из токена аутентификации/авторизации, предоставленного Client. Итак, на уровне сериализации вы получите в основном два параметра, токен и модель, и соответственно сериализуете соответствующие свойства или экземпляр в целом.

Когда дело доходит до определения правил, роли и whatevers за собственность для модели, это может быть сделано различными способами, в зависимости от имеющихся парадигм, то есть в зависимости от языка Service Layer будет реализован. Определения могут быть использованы с использованием Annotations (Java) или Decorators (Python). Для испускания специфических свойств Python будет удобен благодаря своим динамическим наборам и хакерским функциям, например. Descriptors.В случае Java вы можете завершить инкапсуляцию свойств в класс шаблона, скажем AuthField<T>.

Резюме

Суммируя все, я бы предложил поставить экземпляр и разрешение собственности перед API Layer в стадии сериализации. Таким образом, в принципе, роли/правила будут назначаться в модели, и авторизация будет выполняться в сериализаторе, предоставляя модель и токен.

Смежные вопросы