2017-11-06 13 views
1

私はSymfony 3.3アプリケーションを持っていて、dbには通常のユーザエンティティがmanualとして保存されています。symfony、ハードコードされたパスワードを持つ "super"管理者

「管理者」(常にID = 2のユーザー)でログインできるようにする必要がありますが、ハードコードされた固定マスターパスワード(プレーンテキストではないハッシュ)が必要です。

だから、これはアイデアです: usernameはハイテクで、パスワードがXYZであれば、ユーザー管理がログインしている必要があり、カスタム役割を設定する必要があります。

hereを説明するように、私が試した、と私はやった:

public function loadUserByUsername($username) 
{ 
    if($username == 'TECH') { 
     /** @var $user User */ 
     $user = $this->createQueryBuilder('u') 
      ->where('u.username = :username') 
      ->setParameter('username', 'admin') 
      ->getQuery() 
      ->getOneOrNullResult(); 

     $user->setUsername('⭐ TECH'); 
     $user->setPassword('$2y$13$u...'); 
     $user->setIsTech(true); 
     return $user; 
    } 

    return $this->createQueryBuilder('u') 
     ->where('u.username = :username') 
     ->setParameter('username', $username) 
     ->getQuery() 
     ->getOneOrNullResult(); 
} 

とユーザーのエンティティで:

public function getRoles() : array 
{ 
    if($this->isAdmin()) { 
     if($this->isTech) { 
      return ['ROLE_TECH', 'ROLE_ADMIN', ...]; 
     } 
     return ['ROLE_ADMIN', ...]; 
    } else { 
     return ['ROLE_USER']; 
    } 
} 

しかし、それは働いていない、ユーザーが管理者としてログインされていますが、 ROLE_TECHの役割は付与されておらず、カスタム名は設定されていません(それが可能かどうかわかりませんが、それほど重要でない場合)

+0

FOSuserBundleを使用していますか?はいの場合、cliコマンド 'bin/console fos:user:promote admin ROLE_TECH'はどうでしょうか?この種のロジックでは、getRolesメソッドを変更しないでください。これはセキュリティのrole_hierarchy部分の目標です。https://symfony.com/doc/current/security.html#hierarchical-roles – Mcsky

+0

私はFOSを使用していません。とにかく私は管理者を昇進させたくありません。管理者は私たちのクライアント(SaaSサービス)です。彼はいつでもパスワードを変更することができますが、テクニカルチェックのためにマスターパスワードでログインできる必要があります –

答えて

0

マスターパスワードでログインしたい場合はsecurity.ymlファイル

in_memory: 
    memory: 
     users: 
      tech: {password: encoded_password, roles:['ROLE_TECH','ROLE_SUPER_ADMIN','.....']} 

で、このようなメモリのユーザーで作成することによって、それを行うか、適切な役割をデータベースでそれを格納し、それに割り当てることができます。ユーザー/ロールを任意のアクションで使用できないようにするには、ブール値の属性でマークすることもできます。あなたは1人のユーザのためにちょっと複雑なgetRoles()のようなメソッドを作っています。

それ以外の場合は、ユーザーをリフレッシュしてみてください...

+0

また、そのユーザーをすべてのユーザーリストで非表示にしたい"select user ..."とのアプリのドロップダウンが多いです、それは普通のユーザーのようになりますよね? –

+0

in_memoryオプションでユーザーを管理すると、ドロップダウンリストには表示されません。これは別のユーザープロバイダーになります。つまり、データベース・ユーザー・プロバイダーと全く異なるメモリー・ユーザー・プロバイダーがあります。この[doc](https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded)を読んでください。 データベースからユーザーをロードすることを主張する場合は、そのユーザーがドロップダウンや検索に表示されないように、クエリを変更する必要があります(ドロップダウンの量は1〜2つでなければなりません) –

関連する問題