разные логины обращаются к разным данным из таблиц - PullRequest
1 голос
/ 05 мая 2011

Я использую MVC 3 и mssql 2008 r2 и мне было интересно, существует ли автоматизированный механизм, который связывает разные имена входа для разных данных из таблиц базы данных.

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

Адам

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Для этого нет ничего, кроме как структурировать вашу базу данных таким образом, чтобы знать, какие данные принадлежат каждому пользователю.Поэтому вашей таблице CALENDAR понадобится столбец user_id.Если вы используете какую-либо инфраструктуру веб-приложений ASP.NET, включая MVC, у вас есть доступ к поставщику аутентификации, который использует ваше приложение.

Для приложения MVC ваш контроллер должен передать идентификатор пользователя (т.е.HttpContext.Current.User.Identity.Name) к слою данных, которому необходимо использовать это значение в предложении where.

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

0 голосов
/ 05 мая 2011

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

Что бы вы сделали, это создали то, что часто называют CRUD (Create Read Update Delete) хранимыми процедурами для таблиц. Очевидно, что если вы только читаете из таблицы (таблиц), то требуется только чтение.

Внутри хранимой процедуры вы можете использовать логику для фильтрации результатов по имени пользователя.

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

Ex.

    CREATE ROLE CalendarReader AUTHORIZATION dbo;
    GO

    CREATE PROCEDURE Calendar_Get
    AS
       SET NOCOUNT ON;
       SELECT 
           EventDate
          ,EventText
       FROM 
           Calendar
       WHERE 
           UserLogin = suser_sname()
       ;
    GO

    GRANT EXECUTE ON Calendar_Get TO CalendarReader;
    GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...