这是一个相当普遍的问题,实际上......
我有一个用户类(不是每个应用程序?:)。某些用户可以在不同实体上执行操作,前提是他们具有适当的权限。什么是放置授权逻辑(或任何适用于2个实例的逻辑)的更好的地方?
如果我把它放在User类中,我最终会得到一堆user.CanEditComment()
,user.CanEditMessage()
,user.CanDoSomething()
等方法 - 可能是需要授权的每个实体的一些方法。看起来像方法杂乱。
另一方面,我可以将这些方法放在实体中,例如comment.CanBeEditedBy(user)
。但不知怎的,这似乎也不对......
有什么建议吗?
谢谢!
答案 0 :(得分:3)
另一种选择是模仿ASP.NET角色的作用并定义角色集合并将其分配给用户。然后,您的功能可以向用户查询访问该功能所需的角色。您的用户类只需要一种方法HasRole(string roleName)
,您的功能可以控制自己的访问权限。
答案 1 :(得分:2)
我认为为授权逻辑放置数据的最佳位置是您的数据库。根据您的要求,您可以创建一些表格,例如Users
,Roles
,Permissions
,Locations
等。
最近我问过question。你可以看看这个计划。
下一步是授权逻辑。我遇到的第一件事就是使用自定义属性类和覆盖的OnAuthorization
方法。
public class PermissionsAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
// the best place for your authorization logic
}
}
它将使您能够以非常方便的方式将控制权内部分开(就像我一样)。
[Permissions()]
public ActionResult Some()
{
}
答案 2 :(得分:1)
请参阅我对this question的回答。因为您将所有内容存储在DB中,所以可以将枚举Role
更改为字符串列表(从DB加载)。