我正在关注这篇蛋糕 php acl 模型文章来创建我自己的 acl 实现。
我已经理解了 ACO ARO 和 ACO_ARO 的概念。我想实现 Check 方法,该方法将决定 aro 是否可以访问 aco。由于有 ARO 树和 ACO 树,我如何计算 aco 到 a ro 的最有效权限。
我还发现了下面的文章,它实现了检查方法,但那是在 php acl 实现中
简而言之,应该优先考虑什么帐户或组、aco 或父aco。
类似这篇文章的东西
更新到现在我已经到了这里
我制作了一个 accessControlEntry 类,如下所示
public class AccessControlEntry
{
public BsonObjectId AccessControlEntryId { get; set; }
public BsonObjectId AccessRequestObjectId { get; set; }
public BsonObjectId AccessControlObjectId { get; set; }
public bool CanView { get; set; }
public bool CanEdit { get; set; }
public bool CanDelete { get; set; }
public bool CanAdministrate { get; set; }
}
public bool Check(Usercontext usercontext, BsonObjectId acoId, string permission)
{
//aco id is accessControlObjectId like in cakephp acl
Account acc = _usercontextService.GetAccountByUserContext(usercontext);
//getting ACE eg X account has CanRead=true on Y object
AccessControlEntry entry = _accessControlEntryRepository.GetAccessControlEntry(acc.AccountId, acoId);
if (entry != null)
{
bool value = (bool)entry.GetType().GetProperty(permission).GetValue(entry, null);
return value;
}
//account entry not found ...search in groups
bool groupEntryFound = false;
bool effectiveValue = false;
Group[] groups = _usercontextService.GetGroupsForAccount(acc.AccountId);
foreach (Group group in groups)
{
AccessControlEntry entryGroup = _accessControlEntryRepository.GetAccessControlEntry(group.GroupId, acoId);
if (entryGroup != null)
{
groupEntryFound = true;
effectiveValue |= (bool)entryGroup.GetType().GetProperty(permission).GetValue(entryGroup, null);
}
}
//ACE found in group ..return most privilged value
if (groupEntryFound)
return effectiveValue;
//entry not found for account nor for group..return false
return false;
}
我像这样从其他服务调用检查方法
Check(context,44556,"CanRead")
check 方法查找帐户的 AccessControlEntry,如果没有找到帐户的任何条目,则查找组。