2

Symfony 2.1 で、グローバル権限として機能する権限のリスト (組み込みの権限マップで問題ないはずです) を実装する方法が必要です。私がしなければならないことは、グループまたはユーザーが表示できるビューを制限することです。たとえば、2 つのコントローラー (controllerA と controllerB) と 2 人のユーザー (userA と userB) がいます。最初のユーザーは、controllerA によって管理されるビューを表示できる必要がありますが、controllerB のビューは表示できないはずです。代わりに、userB は両方のコントローラーを表示できる必要があります。Symfony のブック/クックブックで ACL に関するチュートリアルを見つけましたが、エンティティに適用されるアクセス許可についてのみ説明しているようで、代わりにコントローラーはエンティティではありません。なにか提案を?

UPDATE 1 ObjectIdentity インターフェイスは、オブジェクトではなく ID によっても作成できることがわかりました。これは、次を使用して、コントローラーのクラス全体に対してアクセス許可を確認できることを意味します。

class MyController extends Controller
{
    public function getId()
    {
        return 'my_controller';
    }

    public function indexAction()
    {
        if ($this->get('security.context')->isGranted('MY_PERMISSION', $this) === false)
        {
            throw new AccessDeniedException();
        }

        ...
    }
}

次のコードを使用して、データベースに acl エントリを挿入します。

$aclProvider = $this->get('security.acl.provider');
$objectIdentity = ObjectIdentity::fromDomainObject($this);
$acl = $aclProvider->createAcl($objectIdentity);

$securityContext = $this->get('security.context');
$user = $securityContext->getToken()->getUser();
$securityIdentity = UserSecurityIdentity::fromAccount($user);

$builder = new MaskBuilder();
$builder->add('MY_PERMISSION');
$mask = $builder->get();

$acl->insertObjectAce($securityIdentity, $mask);
$aclProvider->updateAcl($acl);

これはうまくいくようです。私には2人のユーザーがいます。最初に、上記のコードを使用してコントローラーのクラスを表示する権限を与えましたが、機能しますが、代わりに、権限が設定されていない2番目のユーザーは拒否されたアクセス例外を取得します。ただし、単一のコントローラーのアクションにアクセス許可を与える方法を理解する必要があります。明らかな解決策は、ルート エントリごとにコントローラーのクラスを用意することですが、これは合理的ではありません。

4

1 に答える 1

1

あなたが要求しているものに共通のパターンはありません。Symfony2 セキュリティ http://symfony.com/doc/current/book/security.html

アクションへのアクセスを許可する前に、ユーザーの役割またはグループを確認することを提案しましたか?

if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) {
        throw new AccessDeniedException();
}

例外により、一部のカスタム エラー ページが表示される場合があります。

どうですか:

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: ROLE_USER } 

あなたのsecurity.ymlで

于 2012-10-10T17:12:08.413 に答える