2011-10-21 41 views
0

在我們新的非常大的MVC3應用程序中,我們有一個安全問題需要解決。我們的結構是每個控制器都有一個viewModel和一個viewModelGenerator類。 viewModelGenerator類負責根據需要從儘可能多的數據表構建viewModel。MVC3訪問控制器外部的用戶配置文件數據

我們的問題是,每個用戶只能看到他們的「辦公室」的數據。所以我們必須將用戶「辦公室」信息傳遞給每個viewModelGenerator。

有沒有辦法訪問用戶配置文件數據,而不必將其作爲參數從控制器傳遞?我可以通過構造函數傳遞值,但我們正在尋找有更乾淨的方法。我已經看過關於如何獲得用戶身份的帖子,但沒有看到完整的個人資料。

回答

2

我們的結構是,每個控制器有一個視圖模型

這是一個錯誤的結構。每個視圖應該有一個視圖模型,而不是每個控制器的視圖模型。

有沒有辦法訪問用戶配置文件數據,而不必將 作爲控制器的參數?

不,建議不要有一個服務層來提取這些數據。這些數據必須從它的所有者(這是UI層)推送到服務層

這在ASP.NET MVC中有說法,有更多MVCish方法來實現用戶授權。一個例子是編寫自定義[Authorize]屬性,該屬性將在每個動作之前執行,並驗證用戶是否有權訪問信息。

+0

你在結構上是正確的。這並不完全是我們正在做的,但我簡化了結構以在這裏提出問題。我想到了一個自定義屬性的想法,並提出了一種乾淨的方法,通過控制器使用接口和基類將數據推送到viewModelGenerator。感謝您的想法 –

0

我唯一的想法是創建一個共享的父ViewModel,其中包含UserProfile作爲一個公共字段。

因此,創建一個BaseViewModel並將每個ViewModel設置爲從BaseViewModel繼承。 ViewModelGenerator中的唯一更改應該是您需要在構造函數中爲UserProfile設置適當的值。

我在這裏使用公衆的可行性,但如果這是一個安全問題可能會使用至少受保護的getters和setter。一些類似於:

public class ViewModel1 : BaseViewModel { 
    public ViewModel1() 
     :base(UserProfile profiledata){ 
      //Constructor code for ViewModel1 
    } 
} 

和BaseViewModel:

public class BaseViewModel{ 
    public UserProfile profile;  
    public BaseViewModel(UserProfile prof){ 
     profile = prof; 
    } 
} 
+0

這個級別的安全性不是問題。我正在尋找的是一種傳遞配置文件的方式,無需使用控制器的構造函數調用。如果可能的話。 –

相關問題