【问题标题】:How to structure the security of child objects when a user only has access to the parent当用户只能访问父对象时如何构建子对象的安全性
【发布时间】:2011-12-25 12:19:33
【问题描述】:

我有一个类似于以下的数据库结构:

User
----
Id
Name

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

Customer
--------
Id
Name

Address
-------
Id
CustomerId
Address1

Invoice
-------
Id
AddressId
Number

这是一个 asp.net mvc 站点,因此用户可以转到http://localhost/invoice/details/1 之类的地址,该地址将返回 ID 为 1 的发票。

用户需要登录并分配给发票(通过地址)所属的客户(通过 UserCustomerLink 表)。

我的问题是我应该在哪里检查用户是否可以查看发票?

我应该检查发票是否存在并且用户可以查看它然后从数据库中返回,还是应该从数据库中检索项目然后检查?

我担心为查找此信息而执行的数据库查询的数量,我正在寻找一种有效的方法。这是对结构和一些子属性的简化视图,深度超过 3 倍。

在站点注释中,我首先使用实体​​框架代码,因此如果有办法创建在 Invoice 对象中包含客户 ID 的映射,这可能会解决此问题。

【问题讨论】:

    标签: security asp.net-mvc-3 model-view-controller


    【解决方案1】:

    没有理由两次访问数据库。您可以使用联接并进行一项选择。您所有的表都有链接记录的外键。当查询返回时,您检查用户是否链接到该发票。你可以用 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
    

    【讨论】:

    • 这就是我最终要做的,只是想知道是否有一种“更整洁”的方式不需要尽可能多的连接,但似乎运行得足够快。
    【解决方案2】:

    查看 Authorize 属性。您可以将您的用户放入角色,然后让框架为您检查。

    [Authorize(Roles="AllowedUser")]
    public ViewResult GetInvoies()
    {
       return View();
    }
    

    【讨论】:

    • 您描述的是基于角色的安全性,而这不是。由于用户可以访问多个对象,因此这不是角色问题,而是每个用户之间不同的访问权限。
    猜你喜欢
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多