企业需要一个非常复杂的访问控制系统,在该系统中,会在运行时基于多个条件为用户授予/拒绝权限。只是为了让您了解一下一些资源的规则,例如。
我希望你明白。大约有100多个资源,每个资源都有20到90个类似的规则。
考虑到系统的巨大规模和复杂性,我的团队决定构建一个基于角色的分层访问控制系统,下面是我们如何计划解决该问题的想法。
为每个角色使用一个简单的类
使用反向命令链并为当前角色继承自
当前角色类仅处理当前类唯一的权限。然后一直沿向上(在现实生活中一直向下)以计算完整权限图。
使用装饰器处理跨领域问题的运行时计算,例如,如果用户是受训者或他仍处于试用期,则限制删除权限,或者在用户辞职并刚刚完成其最后一天时限制访问权限公司。
举个例子,用户是经理,但处于试用期 时间,他想访问客户的详细信息。这是伪代码
CountryManagerPermnissionsSpec()
{
immediate_subordinates = ["RegionalManager", "ManagerHR"];
accessible_resources = [
"Finance": ["LIST", "DETAIL", "TRANSACTION_HISTORY", "REPORTS"]
]
}
// class to limit the permissions when user is still under training
TraineeUserPermissionsSpec()
{
blocked_activites = ["delete", "bulk delete", "direct client message"];
}
跳过实施细节,我们可以如下计算当前用户权限
new acl
acl->addRole(ContryManager)
acl->addRole(Trainee)
can_see_data = UserCanViewDataSpec(user, acl)
现在我的问题是,这导致我们进入了许多微小但可测试的类,这对我们来说不是问题,但这是处理此类问题的正确方法吗?有更好的替代品吗?
我不认为这很重要,但是以防万一,当前的系统是用php构建的。