我有一个包含ACL项集合的业务对象,我试图决定是否将授权代码放在业务对象中,如下所示:
class Foo()
{
public IEnumerable<Permission> Permissions { get; set; }
public bool HasPermission(string username, FooOperation operation)
{
// check this Foo's Permissions collection and return the result
}
}
class FooHandler()
{
public void SomeOperation(Foo foo)
{
if(foo.HasPermission(username, FooPermission.SomeOperation))
{
// do some operation
}
}
}
或者像这样的对象处理程序:
class Foo()
{
public IEnumerable<Permission> Permissions { get; set; }
}
class FooHandler()
{
public void SomeOperation(Foo foo)
{
if(SecurityManager.HasPermission(foo, username, FooPermission.SomeOperation))
{
// do some operation
}
}
}
class SecurityManager
{
public HasPermission(Foo foo, string username, FooPermission operation)
{
// check foo's Permissions collection and return the result
}
}
每种方法的优缺点是什么?请记住,在我的数据层中使用实体框架来保持权限集合将在任一种情况下公开。直接的业务对象(如果有必要,我愿意改变它)。
答案 0 :(得分:0)
第二种方法离MVC Controller结构最近:) 但是对于您的问题,最佳做法是将授权与业务逻辑分开,并且您可以将访问管理实现为单独的方法,并在您需要的任何位置调用检查访问权限。这非常相当于MVC控制器中的授权过滤器。
添加说明: 我想从业务对象中删除ACL集合,并从SecurityManager类中的存储库中检索它们。