私は最終的にこれを行う方法を見つけました。おそらくこれを行う最も効率的な方法ではありませんが、これが機能し、これを行う唯一の方法です。
最初に、ログインできないすべてのグループのデフォルト ユーザー (グループのデフォルト アクセス許可を持つダミー ユーザー) を用意します。デフォルト ユーザーのセキュリティ ID を取得します。
$defaultUser = $this->getDoctrine()
->getRepository('TdfUserBundle:User')
->findOneByUsername('-default-'.$group->getCode());
$sid = UserSecurityIdentity::fromAccount($defaultUser);
権限の配列を作成して、空の配列を確認して設定し、問題のある.acl_managerをロードします
$permissionsToCheck = array('VIEW', 'EDIT', 'CREATE', 'DELETE', 'OPERATOR', 'MASTER', 'OWNER');
$aclManager = $this->get('problematic.acl_manager');
次に、アクセス許可を確認したいオブジェクトをループ処理し、$permissionsToCheck var で前に設定したアクセス許可を確認します。デフォルト ユーザーの権限を確認します。結果は、テンプレートに送信する配列に入れられます。
foreach($forumCategories as $forumCategory) :
$permissionArray[] = $this->checkPermissions($sid, $forumCategory, $permissionsToCheck, '');
endforeach;
checkPermissions 関数は、アクセス許可の配列と、指定されたオブジェクトから必要なものを返します。
private function checkPermissions($sid, $object, $permissionsToCheck, $type)
{
$aclProvider = $this->get('security.acl.provider');
$oid = ObjectIdentity::fromDomainObject($object);
try {
$acl = $aclProvider->createAcl($oid);
}catch(\Exception $e) {
$acl = $aclProvider->findAcl($oid);
}
$aclProvider->updateAcl($acl);
foreach ($permissionsToCheck as $permissionCode):
$permissionVar = 'can'.$permissionCode;
$builder = new MaskBuilder();
$builder->add($permissionCode);
$mask = $builder->get();
try {
$$permissionVar = $acl->isGranted(array($mask),array($sid));
} catch(\Exception $e) {
$$permissionVar = false;
}
$tempPermissionsArray[$permissionCode] = $$permissionVar;
endforeach;
$returnArray = array('id' => $object->getId(),'title' => $object->getTitle(),'slug' => $object->getSlug(),'type' => $type, 'permissions' => $tempPermissionsArray);
return $returnArray;
}
フォームの POST の後、どのオブジェクトの権限が変更されたかを確認します。変更された場合は、グループ内のすべてのユーザーをループします。ユーザーごとに権限を取り消し、すべてのグループを取得します (グループのデフォルト ユーザー)。グループ (既定のユーザー) のアクセス許可を確認し、有効にするアクセス許可を確認して、ユーザーに正しいアクセス許可を付与します。
ここでは、すべての権限を false に設定してから、すべてのロール/グループ (既定のユーザー) をループして、権限を設定する必要があるかどうかを確認します。
foreach($array['permissions'] as $permissionCode => $test ):
$$permissionCode = false;
endforeach;
foreach($user->getRoles() as $role):
$role = str_replace('ROLE_', '', $role);
$defaultUser = $this->getDoctrine()
->getRepository('TdfUserBundle:User')
->findOneByUsername('-default-'.$role);
$sid = UserSecurityIdentity::fromAccount($defaultUser);
// See all permissions
foreach($array['permissions'] as $permissionCode => $test ):
$builder = new MaskBuilder();
$builder->add($permissionCode);
$mask = $builder->get();
try {
$isGranted = $acl->isGranted(array($mask),array($sid));
if($isGranted):
$$permissionCode = true;
endif;
} catch(\Exception $e) {
}
endforeach;
endforeach;
この後、ユーザーが持つべき権限を把握し、アカウントにすべての権限を付与します。
$aclManager = $this->get('problematic.acl_manager');
$aclManager->revokeAllObjectPermissions($object, $user);
$mapping = array(
'VIEW' => MaskBuilder::MASK_VIEW,
'EDIT' => MaskBuilder::MASK_EDIT,
'CREATE' => MaskBuilder::MASK_CREATE,
'UNDELETE' => MaskBuilder::MASK_UNDELETE,
'DELETE' => MaskBuilder::MASK_DELETE,
'OPERATOR' => MaskBuilder::MASK_OPERATOR,
'MASTER' => MaskBuilder::MASK_MASTER,
'OWNER' => MaskBuilder::MASK_OWNER,
);
foreach($array['permissions'] as $permissionCode => $test ):
if($$permissionCode):
$mask = $mapping[$permissionCode];
$aclManager->addObjectPermission($object, $mask, $user);
endif;
endforeach;