我有一个mvc应用程序,我有不同的使用角色,角色用户有不同的功能(例如:添加,编辑,删除, - ),每个角色中的用户将具有此角色的此功能的子集.我想授予每个用户基于此权限查看页面的权限.
在mvc中实现这一目标的最佳方法是什么?
谢谢
Aur*_*o82 13
在我们的应用程序中,我们有角色,每个角色都有许多功能.我们的目标是使用尽可能少的数据库访问来控制功能级别的访问而不是角色级别.
这是我们做的:
1)在登录时,我们创建一个UserCredentials对象,其中包含用户有权访问的所有功能(基于其角色).它是用户可以访问的所有角色中包含的所有功能的"不同".然后我们将此UserCredentials存储在会话中.
2)为了限制对控制器或操作的访问,我们实现了一个继承AuthorizeAttribute的属性,我们使用如下:
[Secure(Functionalities="Xyz.View,Xyz.Save")]
public ActionResult SomeAction(...){ ... }
Run Code Online (Sandbox Code Playgroud)
请注意,没有数据库调用,我们所做的就是检查"Xyz.View"是否存在于UserCredentials中的功能列表中.
3)有时我们需要从操作内部访问凭证,因此我们创建了另一个ActionFilter(全局),如果找到名为"credentials"的参数,它将为您注入动作参数中的凭据,例如:
public ActionResult SomeAction(UserCredentials credentials, int otherParameters)
{
// "credentials" is populated by the global action filter
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它根据用户角色或功能显示不同的视图.
4)另一种情况是我们需要根据用户角色或功能隐藏部分视图.为此,我们创建了一个具有UserCredentials属性的BaseViewModel.此属性还由另一个在执行操作后运行的全局ActionFilter填充.如果模型继承BaseViewModel,则过滤器将填充UserCredentials属性.我们可以这样做:
@if(Model.UserCredentials.IsInRole("X")){
<div>Some content</div>
}
Run Code Online (Sandbox Code Playgroud)
要么
@if(Model.UserCredentials.HasAccessTo("Xyz.Save")){
<button>Save</button>
}
Run Code Online (Sandbox Code Playgroud)
我希望它有所帮助.
| 归档时间: |
|
| 查看次数: |
8172 次 |
| 最近记录: |