我有一个mvc应用程序,其中我有不同的使用角色,角色用户具有不同的功能(例如:添加,编辑,删除, - ),每个角色中的用户将具有此功能的子集在这个角色。我想允许每个用户根据此权限查看页面。
在mvc中实现这一目标的最佳方式是什么?
由于
答案 0 :(得分:12)
在我们的应用程序中,我们有角色,每个角色都有许多功能。我们的目标是尽可能少地访问数据库来控制功能级别的访问而不是角色级别。
以下是我们的工作:
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填充。如果模型继承BaseViewModel,则过滤器将填充UserCredentials属性。我们可以这样做:
@if(Model.UserCredentials.IsInRole("X")){
<div>Some content</div>
}
或
@if(Model.UserCredentials.HasAccessTo("Xyz.Save")){
<button>Save</button>
}
我希望它有所帮助。