业务对象或单独处理程序中的授权代码?
Authorization code in business object or separate handler?
我有一个包含 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
}
}
每种方法的优缺点是什么? 请记住,在任何一种情况下,权限收集都将是 public b/c 我正在使用Entity Framework 在我的数据层中直接保留业务对象(如有必要,我愿意在以后进行更改)。
第二种方法最接近 MVC 控制器结构:)
但对于你的问题,最好的做法是将授权与业务逻辑分开,你可以将访问管理作为一个单独的方法来实现,并在你需要检查访问权限的任何地方调用。这非常等同于 MVC 控制器中的授权过滤器。
补充说明:
我想从业务对象中删除 ACL 集合并从 SecurityManager class 的存储库中检索它们。
我有一个包含 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
}
}
每种方法的优缺点是什么? 请记住,在任何一种情况下,权限收集都将是 public b/c 我正在使用Entity Framework 在我的数据层中直接保留业务对象(如有必要,我愿意在以后进行更改)。
第二种方法最接近 MVC 控制器结构:) 但对于你的问题,最好的做法是将授权与业务逻辑分开,你可以将访问管理作为一个单独的方法来实现,并在你需要检查访问权限的任何地方调用。这非常等同于 MVC 控制器中的授权过滤器。
补充说明: 我想从业务对象中删除 ACL 集合并从 SecurityManager class 的存储库中检索它们。