2015-03-25 199 views
5

我有一個mvc應用程序,其中我有不同的角色使用,角色用戶具有不同的功能(例如:添加,編輯,刪除 - ),並且每個角色中的用戶將在這個角色中有這個功能的子集。我想授予每個用戶根據此權限查看頁面的權限。mvc中的用戶角色和權限

什麼是最好的方式來實現這個在MVC?

謝謝

+0

您可以實現一個CustomMembershipProvider。通過這樣做,您可以根據需要配置所有內容。您也可以在數據庫中使用現有的用戶表等。 – Robert 2015-03-25 06:49:54

+0

由於某些原因,我們並未使用成員資格提供程序,因此我們將這些權限存儲在數據庫本身中,並在用戶登錄時加載。 – 2015-03-25 06:56:34

+0

好吧..聽起來就像一個CustomMembershipProvider機制結合CustomRoleProvider ;-) – Robert 2015-03-25 07:27:19

回答

10

在我們的應用程序中,我們有角色,每個角色都有很多功能。我們的目標是在功能級別上控制訪問,而不是角色級別,儘可能減少對數據庫的訪問。

這裏是我們做什麼:

1)在登錄時,我們創建一個包含用戶可以訪問所有功能的UserCredentials對象(基於其角色)。它是包含在用戶可以訪問的所有角色中的「獨特」功能。然後我們將這個UserCredentials存儲在會話中。

2)限制訪問控制器或動作,我們已經實現了繼承AuthorizeAttribute一個屬性,我們使用這樣的:

[Secure(Functionalities="Xyz.View,Xyz.Save")] 
public ActionResult SomeAction(...){ ... } 

注意,沒有數據庫調用,我們要做的是檢查「 Xyz.View「位於存儲在UserCredentials中的功能列表中。

3)有時我們需要從操作內部訪問證書,所以我們已經創建了另一個ActionFilter(全局),例如,如果他找到名爲「credentials」的參數,將爲操作參數注入憑證:

public ActionResult SomeAction(UserCredentials credentials, int otherParameters) 
{ 
    // "credentials" is populated by the global action filter 
} 

您可以使用它顯示基於用戶角色或功能的不同視圖。

4)另一種情況是,我們需要根據用戶角色或功能隱藏部分視圖。爲此,我們創建了一個具有UserCredentials屬性的BaseViewModel。該屬性也由另一個全局ActionFilter填充,該ActionFilter在該動作執行後運行。如果模型繼承BaseViewModel,則過濾器將填充UserCredentials屬性。我們可以這樣做:

@if(Model.UserCredentials.IsInRole("X")){ 
    <div>Some content</div> 
} 

@if(Model.UserCredentials.HasAccessTo("Xyz.Save")){ 
    <button>Save</button> 
} 

我希望它能幫助。

+0

'如果模型繼承BaseViewModel ...'你的意思是如果**視圖模型**繼承BaseViewModel'嗎?爲什麼模型會繼承視圖模型? – Jeff 2017-08-22 16:15:22

+0

是的傑夫,你是對的,我的意思是觀看模型。 – Auresco82 2017-08-23 18:14:41

+0

謝謝。我並不完全確定自己,所以我想知道我是否做錯了事情! – Jeff 2017-08-23 18:22:00