10

管理者がグループまたはユーザーの権限を変更できるこのユーザー マネージャーを構築しています。たくさんカスタマイズしたいので、FOS ユーザーバンドルは使いたくありません。

コントローラーで別のユーザーにアクセス許可を付与できることがわかりましたが、別のユーザー/ロールのアクセス許可を読み取るにはどうすればよいですか? テンプレート内の別のユーザー/ロールのこれらの権限を読み取ることは可能ですか?

これを行う理想的な方法は次のとおりです。(グループ内のユーザーと権限を表示するページ)

1 コントローラー内のすべてのオブジェクトとユーザーを取得する

2 テンプレート内のユーザーとオブジェクトを印刷します。オブジェクトの横に、このグループが持っている権限を表示します: VIEW EDIT DELETE OWNER..

ユーザー(現在ではない)についても同じですが、テンプレートでユーザー(現在ではない)の権限を確認できるようにしたいと考えています。特定のオブジェクト/クラスで..

ユーザーがロール/グループを持っているかどうかを確認する方法は知っていますが、ACL を使用した EDIT VIEW DELETE など、グループ/ユーザーが持っている権限を知りたいです。

どうすればこれを達成できますか?

4

2 に答える 2

3

私は最終的にこれを行う方法を見つけました。おそらくこれを行う最も効率的な方法ではありませんが、これが機能し、これを行う唯一の方法です。

最初に、ログインできないすべてのグループのデフォルト ユーザー (グループのデフォルト アクセス許可を持つダミー ユーザー) を用意します。デフォルト ユーザーのセキュリティ 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;
于 2013-05-13T09:22:31.057 に答える