私はこのケーキphpaclモデルの記事に従って、独自のacl実装を作成しています。
ACOAROとACO_AROの概念を理解しました。aroがacoにアクセスできるかどうかを判断するCheckメソッドを実装したいと思います。AROツリーとACOツリーがあるので、acoからaroへの最も効果的な権限を計算するにはどうすればよいですか。
また、checkメソッドが実装されているが、 phpaclの実装にある以下の記事を見つけました
要するに、何が優先されるべきかアカウントまたはグループ、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メソッドを呼び出します
Check(context,44556,"CanRead")
checkメソッドは、アカウントのAccessControlEntryを検索し、アカウントのエントリが見つからない場合は、グループを検索します。