0

Symfony 自体と組み合わせた認証システムを作成しようとしています。私の論理は次のようなものです:

  1. Userシステムユーザーを保持するテーブルがあります。
  2. Role役割を担当するテーブルがあります。
  3. Permissionウェブサイトの各部分の許可を保持するテーブルがあります。
  4. User_Roleどのユーザーがどのロールであるかを示す表があります。
  5. Role_Permission各ロールの権限を定義するテーブルがあります。

データベースにテーブルとそれらの関係を作成しました。それらをSymfonyにインポートしました(作成されたエンティティ)。

そして今、問題は次のとおりです。

/**
* @inheritDoc
*/
public function getRoles()
{
    return array('ROLE_TEST');
}

各ユーザーのロールをロール配列にロードするにはどうすればよいですか?

4

2 に答える 2

1
public function getRoles()
{
    $roles = array();
    // Checking that the user has permissions attached
    if ($this->getPermissions() !== null)
    {
        // Looping on the permissions
        foreach($this->getPermissions() as $permission)
        {
            // Checking that the permission has roles attached
            if ($permission->getRoles() !== null)
            {
                // Looping on the roles for each permission
                foreach($permission->getRoles() as $role)
                {
                    $roles[] = $role->getName();
                }
            }
        }
    }
    return $roles;
}

より良い解決策は、UserManager Service を作成し、Doctrine Query Builder を介してロールを取得することです (データベースへの呼び出しが少ない):

/** @var EntityManager $this->em */
$roles = $this->em->createQueryBuilder()
    ->select('r')
    ->from('AcmeBundle:Role', 'r')
    ->innerJoin('r.permissions', 'p')
    ->innerJoin('p.users', 'u')
    ->where('u = :user')
    ->setParameter(':user', $user)
    ->getQuery()
    ->getResult()
;
于 2013-11-12T13:59:37.590 に答える
0

Guillaume Verbal のおかげで、別の解決策を見つけました。ユーザーIDとユーザーの役割を返すだけのビューを作成し(ビューごとに4つのテーブルを作成)、最終的にユーザーとuser_role(ビュー)テーブルの間に論理関係を作成しました。すべてがうまくいきます。

于 2013-11-17T14:47:21.007 に答える