Как структурировать безопасность дочерних объектов, когда пользователь имеет доступ только к родительскому объекту - PullRequest
0 голосов
/ 09 ноября 2011

У меня есть структура базы данных, похожая на следующую:

User
----
Id
Name

UserCustomerLink
----------------
UserId
CustomerId

Customer
--------
Id
Name

Address
-------
Id
CustomerId
Address1

Invoice
-------
Id
AddressId
Number

Это сайт MVP asp.net, поэтому пользователь может перейти по адресу, подобному http://localhost/invoice/details/1, который вернет счет с идентификаторомиз 1.

Пользователь должен войти в систему и быть назначен клиенту (через таблицу UserCustomerLink), к которому относится счет (по адресу).

Мой вопрос: где следуетЯ проверяю, может ли пользователь просматривать счет-фактуру?

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

Меня беспокоит количество запросов к базе данных, которые будут выполняться для поиска этой информации, и я ищу эффективный метод.Это упрощенное представление структуры и некоторых дочерних свойств более чем на 3.

В заметке сайта я сначала использую код Entity Framework, так что если есть способ создать отображение, включающее CustomerИдентификатор объекта Invoice может обойти эту проблему.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2011

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

SELECT 
    i.*,
    c.Name
FROM 
    INVOICE i JOIN 
    Address a JOIN
        on i.addressId = a.id
    Customer c JOIN
        on a.customerID = c.id
    UserCustomerLink ucl join
        on c.id = ucl.CustomerId
    User u
        on ucl.Userid = User.id
WHERE 
    i.Id = @invoiceId
0 голосов
/ 09 ноября 2011

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

[Authorize(Roles="AllowedUser")]
public ViewResult GetInvoies()
{
   return View();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...