我正在为Web应用程序中的模型实现访问控制的基础结构。该库有一个上下文类,控制器(也许是视图)用于确定当前用户是否可以访问某个对象。为了保持相关信息接近目标对象,我决定从上下文对象向模型本身传递访问检查请求。
为模型对象修改实现此机制几乎是微不足道的。声明一个接口,比如ICheckModifyAccess
;并在您的模型中实现它。删除检查也是如此。在这两种情况下,都可以询问模型的实例是否可以修改或删除它们。
不幸的是,读取和创建操作并非如此。这些操作要求我向模型类提出问题。因此,使用接口不是一种选择。
我最终创建了一个属性CheckCreateAccessAttribute
,然后最终使用此属性将静态函数标记为接口函数。然后,在我的上下文对象中,我可以使用反射来检查是否存在这样的标记函数,如果它与我期望的签名匹配,并最终调用它。如果它有所不同,创建访问权限检查的方法是public bool CanCreate<TObj>();
。支持访问控制的典型模型会在类中添加如下内容:
[CheckCreateAccess]
public static bool CanCreate()
{
return true;
}
我对C#不是很流利,而且我有一种唠叨的感觉,我做错了什么。你能建议一个更优雅的选择吗?特别是,你可以通过反思去除TObj
吗?
答案 0 :(得分:2)
我认为您不应该询问某个特定用户是否可以修改他(除非修改权限是每个具体实体)。只需创建一个处理权限的类(或使用适当的现有类)。
这将消除您对静态类和反射的需求。
如果你有很多类型,每个类型都有自定义规则(即代码),你可以有一个通用的抽象类型(接口或抽象类),它能够检查一种类型的规则和一些存储库来检索特定的实例。
答案 1 :(得分:2)
听起来您已经在对象类中结合了关注点而不是separating them。
“将相关信息保持在目标对象附近”的诱惑可能会引导您进入这种结构。
也许你可以改为在一个单独的类中处理权限,例如参见this article。