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

我可以用每种方法写:

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

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

有帮助吗?

解决方案

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

其他提示

只要您使用校长已经存在...

[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
}

在施工时间进行一次检查,如果不满足安全状况,请扔(或从工厂退回)。此后,持有对给定模型对象的引用足以证明您在早期的某个点通过了安全检查。如果您担心这可能导致 tocttou 问题,确保在应用程序定义的“游戏转向”概念结束时这些对象变得无法使用(通常是数据库事务);无论如何,这是一个好习惯。

这种安全方法称为 能力学科. 。将您的对象视为具有的框 他们内心的一些权威 (在他们的私人变量中)。通过按盒子上的按钮,您只能以对象允许您允许的方式进行量身定制的该权限的量身定制的部分。

例如,假设您正在编写带有SQL后端的日历应用程序。有 SQLTransaction 对象,该对象不会超过交易(按照上述),但它仍然具有应用程序使用的所有表的所有权利。这是您不想传递给API的用户(明确或错误地,想想SQL注入)的功能。相反,你分发了 User 对象将仅在用户表中写入该用户行的权限建模;亦是 User 可以创建,阅读,更新,删除 Appointment 对象在约会表中类似地代表有限的权威。

为了在整个API中维护RBAC,您必须确保以下内容:

  1. 只有合法用户才能访问 User 代表它们的对象。这是您将身份验证系统连接到的地方 User 构造函数;
  2. User 对象没有 泄漏权限, ,即您必须审核您的API,以确保通过锻炼方法来调用 User (或他们递归返回的任何相关对象)您无法阅读或更改不属于此用户的任何资源。这是您可以应用的地方 方面 模式 - 例如 User.GetAppointments() 返回真实 Appointment 该用户创建的约会实例,但针对其他人创建的内容只读包装器。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top