2011-03-03 29 views
0

我需要爲不同類型的用戶創建不同的頁面視圖。 我已經問過這裏:How to create pages with different permissions' views如何使用不同權限的視圖創建頁面

即使Aldeel的答案有效,它似乎並不是我最好的解決方案。我會解釋爲什麼。

我會盡力解釋什麼,我需要非常詳細和hopefuly一些,你將能夠幫助我:d

我需要表現出不同的看法,但它不只是這樣。每個用戶都可以訪問頁面的不同部分。

我舉一個例子:

想象一下,一個頁面的「X」這個結構

Field A 
Field B 
Field C 
Field D 

當用戶U1從組G1訪問頁X系統檢查DB該組的權限上頁面X。用戶U1可以看到Field AField B,但只能編輯Field A

用戶U2設置爲無組訪問頁面X。系統檢查他的權限頁X。用戶U2可以查看和編輯所有字段。

當來自組G2的用戶U3訪問頁面X時,系統檢查數據庫中該組的權限X。用戶U3可以看到Field CField D,但不能編輯任何。

我希望這是很容易理解...

我coudn't找到一個方法來做到這一點,而不是有很多關於特定用戶的許可數據填充的ViewData的。在我的例子中只有4個字段,但在我目前的項目中,我沒有少於20個字段的屏幕。所以我想你可以看到這是多麼醜陋和沒有生產力。

這個想法與社交網絡類似,正如我所說(facebook example)。當訪問UserX頁面的用戶只能看到UserX允許他訪問的內容。

我真的很感激任何幫助。

此致敬禮。

回答

4

要做你想要做的事,你不應該控制你的觀點 - 你實際上必須保護你的控制器 - 而不是觀點。你可以通過控制器屬性來完成。類似的東西:

[Authorize] 
public class MyController { 
} 

通過這樣做,你可以保護整個控制器。如果用戶未通過身份驗證,則該控制器內的每個操作都不會響應(具體而言,他們將收到401響應)。您可以通過授權個人用戶或個人角色在下面的例子顯示擴展此:

[Authorize(Users="eestein,JasCav") 
public class MyController { 
} 

[Authorize(Roles="Administrator")] 
public class MyController { 
} 

在你的情況,你可能不希望有它的授權可將整個控制器。那麼,非常好,ASP。NET MVC提供了認證的動作級別控制。所以,你可以這樣做:

public class MyController { 

    public ActionResult Index() { } 

    [Authorize(Roles="Administrator")] 
    public ActionResult Admin() { } 

} 

使用這個想法,這是你可以控制用戶在頁面上看到的內容。您將要從您的操作中返回部分頁面,以便加載頁面的各個方面。例如,您可能有一個顯示一些正常數據和一些祕密數據的視圖。普通數據可以通過普通頁面返回。祕密數據應作爲頁面內的局部視圖返回。但是,如果發生401,您可以處理它,只是不顯示任何內容。

這是相當直接的做法。 .NET團隊做了很好的設置,你不必單獨檢查控制器中的權限。我希望這有助於你開始。在線搜索有關如何使用授權屬性的更多信息。

更新 在你誰是控制這些權限頁的管理員的情況下,你必須要聰明的你如何設置你的授權屬性。這就是「角色」非常重要的地方(根據我上面的例子)。例如,如果管理員說:「我要將John Doe添加到SpecialUser角色」,那麼John Doe用戶將能夠訪問所有將角色設置爲SpecialUser的操作(如果確實如此在你的系統上扮演一個角色)。

很明顯,你將不得不爲管理員提供一些能夠做到這一點的方法,並且Authorize屬性完全可以做到這一點。要查看誰在頁面上擁有權限,您必須查詢數據庫以查明誰是角色的一部分。這裏有一種思考設置的方法:

  • 您可以控制操作的角色。
  • 您的管理員控制誰被授予這些角色。
  • 您可以隨時查看(通過簡單的查詢)查看誰分配了什麼角色。然後,您可以(通過您對操作角色的瞭解)瞭解誰可以查看網站的哪些部分。

我希望這個澄清(我希望我能夠很好地理解你的問題)。我認爲你想要做的事情是可能的。

更新2 是的,這確實假定您的控制器上有靜態組,並且必須以編程方式添加任何新組。我很想知道什麼樣的用例需要不同的權限類型來即時創建 - 這看起來好像會被濫用。無論如何,我沒有解決方案。

至於如何局部視圖的工作......這是像這樣...

public class ProductController : Controller 
{ 
    // 
    // GET: /Index/ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Partial1() 
    { 
     return PartialView(); 
    } 

    [Authorize] 
    public ActionResult Partial2() 
    { 
     return PartialView(); 
    } 
} 

內,您的Index.aspx的文件,你就會有這樣的事情:

<%= Html.RenderAction("Partial1") %> 
<%= Html.RenderAction("Partial2") %> 

如果用戶沒有授權,您可以處理第二個RenderAction,因此該視圖甚至無法顯示。 (您可以在您的控制器中查看。)

希望澄清事情!我正在運行,所以現在我無法再擴展它。

+0

@JasCav謝謝你的回答。我已經在使用[Authorize]屬性。不像你特別說的那樣。我只用它來防止未經授權的訪問。但是,除非我不能完全理解它是如何工作的,否則還有另一個問題。該權限將由該特定頁面的adm設置(這就是爲什麼我使用了Facebook的示例)。我無法看到他希望別人看到而不是檢查數據庫。我怎樣才能返回一個特定的局部視圖?用戶可以擁有字段a和b的權限,或者只有c或任何其他權限。您的解決方案適用於這種情況嗎?再次感謝。 – eestein 2011-03-03 17:53:45

+0

@eestein - 我的解決方案可以適用於您所描述的情況,假設它已正確設置。我現在正在寫一個更新到我的答案 - 一會兒找。 – JasCav 2011-03-03 18:02:02

+0

@JasCav謝謝,我會等。 – eestein 2011-03-03 18:05:00

1

我會推薦「添加劑」安全;一個用戶的權限和他的任何一個組的權限,總共可以給他一系列允許他做的事情。如果他沒有明確的許可要求做某些事情需要許可,他不允許這樣做。在你的情況下,在User U1和Group G1之間,有足夠的權限授予用戶查看字段A和字段B並編輯字段A.由於用戶自己或通過他們的組未被明確授予編輯字段B或查看或編輯字段C和D,他沒有這些權限。

我將通過在代碼隱藏中放置一個方法來實現這種類型的權限,該方法將接受代表用戶及其權限的對象,並詢問這些權限以確定字段的可見性。所有字段都應以不可見的方式出現,並且此方法將使其可見和/或可編輯。

事情需要注意的:

  • 確保您使用的是.NET服務器端工具來顯示/隱藏字段。如果在服務器端某個字段的Visible屬性設置爲false,則呈現的頁面甚至不會在HTML中包含該字段。相比之下,添加樣式或使用JavaScript來隱藏屬性會將它們保留在DOM中,並且保存在HTML中,因此用戶可以「查看源代碼」來查看以這種方式隱藏的字段。
  • 切勿使用客戶端代碼來實現安全性。 JavaScript,ActiveX控件等可以被拒絕,禁用和/或操縱。顯示數據的客戶端代碼也要求數據位於頁面源代碼的某處,這意味着通過查看頁面源代碼可以很容易地找到它。
  • 出於同樣的原因,不要相信不可編輯的字段不會更改其數據。 HTML和客戶端代碼,可以使用FireBug等工具輕鬆更改。
  • 如果您從一切看不見/禁用,並使其可見/啓用,您的代碼將更安全,如果你開始以開放的訪問和隱藏的東西。如果你忘記隱藏新的東西,所有突然的客戶都會看到一個他們不應該碰觸的新領域。如果您忘記添加代碼以顯示基於權限的新字段,則仍然需要修復它,但是利用不存在的字段更難或不可能。
相關問題