3

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

我可以在每种方法中写:

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

我正在考虑通过向此方法或任何其他解决方案添加属性来自动化此过程?

4

3 回答 3

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
}
于 2010-10-15T09:47:37.527 回答
1

施工时检查一次,如果不满足安全条件则抛出(或工厂返回NULL)。此后,持有对给定模型对象的引用就足以证明您在早些时候通过了安全检查。如果您担心这会导致TOCTTOU问题,请确保这些对象在应用程序定义的“游戏回合”概念(通常是数据库事务)结束时变得不可用;无论如何,这是一个好习惯。

这种安全方法称为能力纪律。将您的对象视为在它们内部(在它们的私有变量中)具有某些权限的盒子。通过按下框上的按钮,您只能以对象程序员允许的方式行使该权限的一部分。

例如,假设您正在编写一个带有 SQL 后端的日历应用程序。有一个SQLTransaction对象,它不会超过事务(如上所述),但它仍然拥有应用程序使用的所有表的所有权限。这是您不想传递给 API 用户的很多功能(明确地或错误地,想想 SQL 注入)。取而代之的是,您分发User对象,这些对象模拟了仅写入用户表中该用户行的权限;还User可以创建、读取、更新、删除Appointment对象,这些对象同样代表 Appointments 表中的有限权限。

要在整个 API 中维护 RBAC,您必须确保满足以下条件:

  1. 只有合法用户才能访问User代表他们的对象。这是您将身份验证系统连接到User构造函数的地方;
  2. User对象不会泄露权限,也就是说,您必须审核您的 API 以确保通过对 a User(或它们以递归方式返回的任何相关对象)执行方法调用,您无法读取或更改任何不属于该用户的资源。这是您可以应用构面模式的地方——例如,User.GetAppointments()返回由该用户创建的约会的真实Appointment实例,但为其他人创建的约会返回只读包装器。
于 2010-10-15T10:04:54.457 回答
0

看看“面向方面编程”(AOP)库——以及这个 StackOverflow 问题的答案。您可以使用 AOP 自动添加角色检查代码。

于 2010-10-15T09:12:57.340 回答