解決
そうですね、少し古いSymfony2リリース(2.0-RC6)を使用すると、それが得られます。にバグがあったようです__construct
( 2010RoleSecurityIdentity
年12月に報告)。
代わりinstance of Role
にinstance of RoleInstance
。
私はおそらくこの質問を閉じる必要があります...
私は全体ACL
の概念にかなりSymfony2
慣れていませんが、その背後にある基本を理解しています。昨夜、私は次のシナリオを機能させようとしていました。
2つのユーザーロール(ROLE_GROUP1
、 )があり、これらのグループの1つにオブジェクトレベルROLE_GROUP2
を設定したいと思います。のユーザーがログインしている場合は、この役割をに配置する必要があります。それ以外の場合は、を配置する必要があります。 ACL
ROLE_GROUP1
ACE
ROLE_GROUP2
これまでのところ、私はこのコードを書きました(実際には公式のドキュメントとほとんど同じです):
$role = $this->getRole(); // returns ROLE_GROUP1 role object
$acl_provider = $this->get('security.acl.provider');
$objIdentity = ObjectIdentity::fromDomainObject($object); // my object
$acl = $acl_provider->createAcl($objIdentity);
$securityIdentity = new RoleSecurityIdentity($role->getRole()); // Role based identity
$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
$acl_provider->updateAcl($acl);
私の理解では、これにより、ROLE_GROUP1
役割を持つユーザーにすべてのアクセス許可が付与されます。私が間違っている?
権限を確認するために、私はこのコードを使用しました(これも公式ドキュメントから):
$context = $this->get('security.context');
if ( false === $context->isGranted("EDIT", $object) ){
throw new AccessDeniedException();
}
...しかし、常に失敗します(つまり、例外がスローされます)。
ACLテーブルを調べたところ、私が見る限り、すべてが正常に見えました。
RoleSecurityIdentityで何か問題がありますか?このシナリオを達成する方法はありますか?
どんな助けでも大歓迎です!
編集
symfonyのコードをドリルダウンしたところ、のequals
メソッドでパーミッションの付与が失敗することがわかりましたRoleSecurityIdentity
。
if (!$sid instanceof RoleSecurityIdentity) {
return false;
}
/** I ADDED THIS IF CHECK TO SEE WHAT DOES IT COMPARE WITH **/
if ( $this->role->getName() == "ROLE_GROUP1" ){
die("<pre>" . print_r($sid->getRole(),1) . "</pre><pre>" . print_r($this->role,1) . "</pre><pre>" . print_r($this->role === $sid->getRole(),1) . "</pre>");
}
return $this->role === $sid->getRole();
がROLE_GROUP1ロールのオブジェクトであるのに対し、それ$sid->getRole()
はstring
「ROLE_GROUP1」であることがわかります。$this->role
Role