【发布时间】:2013-12-04 19:04:44
【问题描述】:
在我的应用程序中,我有两个角色:管理员和用户。管理员可以分配用户以允许他们对特定对象执行特定功能。
由于这超出了 SimpleMembership 角色可以提供的范围,我有一个静态帮助方法来检查用户是否有权访问特定功能:
public static class SecurityCheck
{
public static bool UserHasAccess(int objectId, string functionName)
{
// Decorates the security provider -- gets logged in User ID and calls to a repository to query the database
// ...
}
}
然后我可以在我的视图中使用它来确定是否应该根据对象的 ID 为该用户呈现特定功能:
@foreach (var item in Model.FooData)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Notes)
</td>
<td>
@Html.ActionLink("View Data", "View", new { @id = item.Id })
@if (SecurityCheck.UserHasAccess(item.id, "Edit Data"))
{
@Html.ActionLink("Edit Data", "Edit", new {@id = item.Id})
}
@if (SecurityCheck.UserHasAccess(item.id, "Delete"))
{
@Html.ActionLink("Delete", "Delete", new {@id = item.Id})
}
</td>
</tr>
}
我必须相信有更好的方法来做到这一点,因为对静态方法的每个单独调用都涉及到数据库的单独往返,但我被困在放置代码的最佳位置。我考虑过的一些想法:
- 向我的 ViewModel 添加方法以将函数列表传递到存储库,返回用户可以为每个对象执行的函数列表。进一步考虑这一点,我什至不确定这是否可能,尽管它会很丑陋。
- 让 ViewModel 保持不变,让我的应用层服务获取可用功能。这将涉及向我的域模型对象添加其他属性,我对此并不着迷。
- 创建一个可以从控制器调用的单独服务,该控制器可以将函数列表填充到 ViewModel。这将涉及将多个服务注入到每个控制器中——这也不是很疯狂。
我倾向于#2。但我仍然觉得我忽略了更可靠的实现。有没有人处理过类似的事情?
【问题讨论】:
标签: c# asp.net asp.net-mvc razor domain-driven-design