我正在使用MVC 3和mssql 2008 r2和 我想知道是否有一種自動化機制將不同的登錄關聯到數據庫表中的不同數據。不同的登錄訪問表中的不同數據
例如,我想創建一個日曆。但我希望每個用戶只能查看他自己的條目。所以我有一張桌子與時間和地點的約會。但我不想包含來自LDAP的關聯,因爲我需要在很多地方這樣做。
亞當
我正在使用MVC 3和mssql 2008 r2和 我想知道是否有一種自動化機制將不同的登錄關聯到數據庫表中的不同數據。不同的登錄訪問表中的不同數據
例如,我想創建一個日曆。但我希望每個用戶只能查看他自己的條目。所以我有一張桌子與時間和地點的約會。但我不想包含來自LDAP的關聯,因爲我需要在很多地方這樣做。
亞當
如果你不打算做這個應用程序中的邏輯,那麼我現在能想到的做到這一點的唯一方法是通過使用存儲過程或表值函數。
你要做的是創建通常被稱爲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
除此之外,沒有別的辦法可以讓您的數據庫構造成知道哪些數據屬於每個用戶。所以你的CALENDAR表需要一個user_id列。如果您使用任何基於ASP.NET的基於Web的應用程序框架(包括MVC),則可以訪問應用程序使用的身份驗證提供程序。
對於MVC應用程序,控制器需要將用戶ID(即HttpContext.Current.User.Identity.Name)傳遞給數據層,該數據層需要在where子句中使用此值。
試圖隱式地做到這一點只會讓你陷入困境。例如,如果您需要管理員可以訪問多個用戶的日曆,則不能使用隱式過濾器。你需要讓你的控制器告訴你的數據層它想要什麼。