Логика приложения (правильное место для аутентификации / авторизации) - PullRequest
4 голосов
/ 14 декабря 2010

Я занимаюсь разработкой приложения, подобного CMS, с использованием MVC 3 (RC2), и сейчас я нахожусь на распутье.Я не могу убедить себя, подходит ли мой предложенный подход или нет.Я предполагаю, что это потому, что я знаю, что я пытаюсь сократить некоторые углы, которые позже будут стоить мне дороже.

Я сразу приступлю к описанию моей проблемы:

1)У меня есть ресурс (давайте назовем его A), который нужно сделать доступным для редактирования.

2) У меня реализована система пользовательских разрешений, которая имеет 2 (из многих) разрешений:

  • Может редактировать собственный ресурс
  • Может редактировать другой ресурс

3) Создатель ресурса A может редактировать его, если у него есть разрешение «Редактировать собственный ресурс».

4) Отдельный пользователь может редактировать A, только если у него есть разрешение «Редактировать другой ресурс»

Теперь, когда требование описано, позвольте мне рассказать вам о моем подходе:

1)У меня есть контроллер с именем 'ResourceController'

2) У меня есть действие с именем 'Edit'

3) У действия есть атрибут: [CustomerAuthorize (Perm.CanEditOwnResource, Perm.CanEditOtherResource), Any = true)]

4) У меня есть сервискласс, который заботится о проверке домена.

Таким образом, пользователь может вызвать метод действия, если у него есть разрешение «Можно редактировать собственный ресурс» или «Можно редактировать другой ресурс».

Как сделатьЯ решаю (и где следует принять это решение) о том, имеет ли пользователь право доступа или нет (в зависимости от того, владеют ли они ресурсом?). Должен ли он быть в действии контроллера, в классе обслуживания ресурсов, в отдельном классе обслуживания?

В ожидании услышать разные взгляды ...

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

Из-за природы MVC вам нужно будет проводить проверки подлинности в разных точках.

Для одного вам нужно будет иметь возможность отображать визуальные подсказки в интерфейсе пользователя (т.е.кнопка редактирования или не показывать ее), поэтому логика должна быть доступна для ваших представлений.

Конечно, это только для целей пользовательского интерфейса.Вам также понадобится аутентификация / авторизация для действий вашего контроллера, на случай, если кто-то обойдёт ваш пользовательский интерфейс, чтобы получить к нему доступ.

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

0 голосов
/ 14 декабря 2010

Один из способов подойти к этому - это иметь 2 действия, вместо этого только «Редактировать», у вас есть «EditOwnResource» и «EditOtherResource».Затем вы можете разместить одно разрешение для каждого из них.

Затем, если вы используете шаблон MVVM, вы можете связать доступность этих действий с тем, является ли это ownResource или otherResource.Установка этих значений выполняется в модели представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...