2014-03-10 1 views
1

У меня есть веб-сайт ASP.net с MS SQL Server на сервере.ASP.net Ограничить пользовательские функции на основе пользовательских ролей и разрешений таблиц, а не членов ASP

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

ТАБЛИЦЫ:

tblSYSTEMS
• SYSTEMID (PK)
• SystemDescription
• Другие колонны

tblSYSTEMS_Projects (многие проекты могут быть связаны с каждой системой)
• Различные поля, которые пользователи могут см./изменить/удалить на основе разрешений.

ПОЛЬЗОВАТЕЛЕЙ (как генерируется ASP.net, для пользователей/членства/ролей и т.д ...)
• USERID
• Другие колонки

tblSYSTEMS_PERMISSIONS_LINK (это связывает две таблицы)
• SystemID
• Идентификатор_пользователя
• AllowEdit
• AllowView • AllowDelete
• AllowInsert

Я создал хранимую процедуру для каждой функции INSERT/UPDATE/DELETE в базе данных для tblSYSTEMS_Projects.

Когда пользователь переходит к изменению/добавлению/удалению записи в tblSYSTEMS_Projects, я отправляю параметр @userid (от текущего пользователя) в SP.

Для ОБНОВЛЕНИЯ Я проверяю, что в tblSYSTEMS_PERMISSIONS_LINK у них AllowEdit установлен как истинный, для данной SYSTEM в tblSYSTEMS. Способ привязки таблиц, если у них нет прав EDIT, не будет обновляться строка (потому что предложение WHERE по существу возвращает 0 строк), и я возвращаюсь к выполнению SP. Хорошо.

То же самое касается DELETE.

Но для INSERT нет никаких предложений WHERE для записей INSERTING в tblSYSTEMS_Projects.

  1. Как я могу предотвратить идентификатор пользователя, у которого нет вложений INSERT для конкретной системы, из вставки в таблицу tblSYSTEMS_Projects?
  2. Когда текущий вход в систему userid пытается щелкнуть по INSERT, что я могу сделать, чтобы перенаправить их на страницу «у вас нет epermission»?
  3. Могу ли я просто скрыть команду INSERT на основе текущего входа в систему? Когда я это сделаю? Нагрузка на страницу? Любые предложения по методологии для этого? Простой SP, который возвращает скаляр значения INSERT?

Я смотрел роли/членство и т. Д. ... но это не совсем работает, так как многие разные люди имеют разные разрешения на основе системы. В одной системе один человек может быть ADMIN и другой системой - быть только зрителем.

То, что я пытаюсь сделать, состоит в том, чтобы пользователи имели доступ к своим записям, но предоставляли им разрешение делать то, что им разрешено делать. Но эти разрешения различаются в зависимости от SystemID.

ответ

0

Есть много способов сделать это. Вот мой подход, который является Ролевая авторизация -

Я ограничу авторизацию на основе ролей пользователя. Например, если Система находится в AddRole, а пользователь находится в AddRole, то пользователь может создать новую запись.

Логика авторизации страницы не должна выполняться только в процедуре сохранения. Вместо этого он должен быть запущен на уровне презентации (например, Controller).

Если вам нужна проверка дополнительной логики, вы можете разместить ее на уровне бизнес-логики.

enter image description here

tblSYSTEMS_PERMISSIONS_LINK (this links the two tables) 
• SystemID 
• userid 
• AllowEdit 
• AllowView 
• AllowDelete 
• AllowInsert 

Вы не должны создавать о tblSYSTEMS_PERMISSIONS_LINK таблицы с отдельной колонкой. Это не хороший дизайн базы данных, если вы не можете на 100% убедиться, что в будущем не будет никаких новых Тип авторизации.

+0

Думаю, я вижу, что вы делаете. Также должно быть поле внутри UsersInRoles, которое является частью первичного ключа, который связывает систему. Как я уже сказал, пользователь может иметь права на редактирование в системе A, но только просмотр в системе B. Таким образом, роль зависит от пользователя/системы. Мне нравится идея добавления таблицы ролей. – RadioActiveEd

+0

Если вы используете ** поставщика DefaultRole **, вы не можете добавить дополнительные столбцы в ** таблицу UsersInRoles **. другими словами, если вы добавите столбец в ** UsersInRoles **, вам нужно будет создать ** Поставщик пользовательских ролей **. – Win

+0

На данный момент я использую только таблицы ASP.net для управления входами. Мне все равно, что ASP.net управляет пользователями, а не обязательно роли. Я использую это только для получения идентификатора пользователя текущего пользователя. – RadioActiveEd

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