2010-10-15 101 views
3

我正在实现对类中的不同方法使用基于角色访问的系统。例如,要执行任何操作,我需要检查使用它的用户是否可以执行此操作。基于角色的访问方法

我可以在每种方法写:

if(User.IsInRole ...) { 
} else { 
return ... throw ... whatever 
} 

我在想通过添加属性此方法或也许任何其他溶液自动化这个过程例如?

回答

0

看看'Aspect Oriented Programming'(AOP)库 - 以及this StackOverflow question的答案。 您可以使用AOP自动添加角色检查代码。

3

只要你用校长的东西已经在那里了......

[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")] 
public void Foo() 
{ 
    // Will throw an exception if the principal does not have the required role 
    // Otherwise the method will execute normally 
} 
1

在构造时做检查一次,并引发(或从工厂返回NULL)如果安全条件没有得到满足。此后,持有对给定模型对象的引用足以证明您在某个早期点通过了安全检查。如果您担心这可能导致TOCTTOU问题,请确保这些对象在应用程序定义的“游戏开启”概念(通常是数据库事务)结束时变得不可用;无论如何,这是一个很好的做法。

这种安全方法称为capability discipline。将您的对象视为具有some authority inside them(在其私有变量中)的框。通过按下框中的按钮,您只能以对象的程序员允许的方式对该权限执行定制的部分。

例如,假设您正在编写带有SQL后端的日历应用程序。有一个SQLTransaction对象,它不会超过事务(如上所述),但它仍具有应用程序使用的所有表的所有权限。这是很多权力,你不想传递给你的API的用户(明确或错误地认为SQL注入)。相反,您可以发布User对象,这些对象将建模权限仅写入Users表中的用户行; User也可以创建,读取,更新,删除Appointment对象,这些对象类似地代表Appointments表中的有限权限。

为了保持RBAC整个API,你必须确保下列条件成立:

  1. 只有合法用户才能获得访问User对象表示他们。这是将验证系统连接到User构造函数的地方;
  2. User对象不leak authority,即你必须审核您的API,以确保在User通过锻炼方法调用(或任何相关的对象他们返回,递归),您无法读取或修改不属于任何资源这个用户。这是您可以应用facet模式的位置 - 例如,User.GetAppointments()会为该用户创建的约会返回实际Appointment实例,但会为其他人创建的约会创建只读包装。
相关问题