1

我正在使用MVC 3和mssql 2008 r2和 我想知道是否有一种自动化机制将不同的登录关联到数据库表中的不同数据。不同的登录访问表中的不同数据

例如,我想创建一个日历。但我希望每个用户只能查看他自己的条目。所以我有一张桌子与时间和地点的约会。但我不想包含来自LDAP的关联,因为我需要在很多地方这样做。

亚当

回答

0

如果你不打算做这个应用程序中的逻辑,那么我现在能想到的做到这一点的唯一方法是通过使用存储过程或表值函数。

你要做的是创建通常被称为CRUD(创建读取更新删除)存储过程的表。很明显,如果你只是从表格中读取数据,那么只需要一个读取存储器。

在存储过程中,您可以根据用户的登录信息放入逻辑以过滤结果。

您可以将用户分配给数据库中的某个角色,并为该角色赋予该存储过程的执行权限。或者,如果您正在使用表值函数,那么您将为该函数提供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 
0

除此之外,没有别的办法可以让您的数据库构造成知道哪些数据属于每个用户。所以你的CALENDAR表需要一个user_id列。如果您使用任何基于ASP.NET的基于Web的应用程序框架(包括MVC),则可以访问应用程序使用的身份验证提供程序。

对于MVC应用程序,控制器需要将用户ID(即HttpContext.Current.User.Identity.Name)传递给数据层,该数据层需要在where子句中使用此值。

试图隐式地做到这一点只会让你陷入困境。例如,如果您需要管理员可以访问多个用户的日历,则不能使用隐式过滤器。你需要让你的控制器告诉你的数据层它想要什么。

相关问题