我正在实现系统,它使用基于角色的访问类中的不同方法。例如,要执行任何操作,我需要检查使用它的用户是否可以执行此操作。
我可以在每种方法中写:
if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}
我正在考虑通过向此方法或任何其他解决方案添加属性来自动化此过程?
我正在实现系统,它使用基于角色的访问类中的不同方法。例如,要执行任何操作,我需要检查使用它的用户是否可以执行此操作。
我可以在每种方法中写:
if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}
我正在考虑通过向此方法或任何其他解决方案添加属性来自动化此过程?
只要您使用主体,事情就已经存在...
[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
}
施工时检查一次,如果不满足安全条件则抛出(或工厂返回NULL)。此后,持有对给定模型对象的引用就足以证明您在早些时候通过了安全检查。如果您担心这会导致TOCTTOU问题,请确保这些对象在应用程序定义的“游戏回合”概念(通常是数据库事务)结束时变得不可用;无论如何,这是一个好习惯。
这种安全方法称为能力纪律。将您的对象视为在它们内部(在它们的私有变量中)具有某些权限的盒子。通过按下框上的按钮,您只能以对象程序员允许的方式行使该权限的一部分。
例如,假设您正在编写一个带有 SQL 后端的日历应用程序。有一个SQLTransaction
对象,它不会超过事务(如上所述),但它仍然拥有应用程序使用的所有表的所有权限。这是您不想传递给 API 用户的很多功能(明确地或错误地,想想 SQL 注入)。取而代之的是,您分发User
对象,这些对象模拟了仅写入用户表中该用户行的权限;还User
可以创建、读取、更新、删除Appointment
对象,这些对象同样代表 Appointments 表中的有限权限。
要在整个 API 中维护 RBAC,您必须确保满足以下条件:
看看“面向方面编程”(AOP)库——以及这个 StackOverflow 问题的答案。您可以使用 AOP 自动添加角色检查代码。