2017-12-18 11 views
1

大規模なSymfonyプロジェクトの上に私の同僚のために作成したデータエクスポートバンドルのアクセスを管理するためにFOSUserバンドルを使用しています当社の したがって、私はSymfonyプロジェクトからデータの定義された部分をエクスポートすることを可能にするDataexportBundleを作成しました。ログインしていないユーザが既にログアウトしていない「FOSUser Bundle」を持っている場合

DataexportBundleは、彼らがクエリを選択し、 JSONまたはCSVのようなさまざまな形式でデータを取得することができ、当社の従業員のための

  • ダウンロードエリアを提供しています。
  • 従業員のダウンロード領域で選択可能なデータベースクエリを管理(追加、編集、削除)できる管理領域。

「データエクスポート」ダウンロード領域は、従業員だけがアクセスできるように保護する必要があります。匿名ユーザーはこのエリアにアクセスすることはできません。 "データエクスポート"管理領域は、追加の管理者役割を持つ一部の従業員のみがアクセスできます。

したがって、私は私の「security.ymlファイル」のファイルにロール階層を有効に:あなたが見ることができるように

security: 
    role_hierarchy: 
     ROLE_USER:  [ROLE_USER] 
     ROLE_EDITORIAL: [ROLE_USER, ROLE_EDITORIAL] 
     ROLE_ADMIN:  [ROLE_USER, ROLE_EDITORIAL, ROLE_ADMIN] 
     ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_SUPER_ADMIN] 
    access_control: 
     - { path: ^/dataexport/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/dataexportadmin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/dataexport/, role: ROLE_EDITORIAL } 
     - { path: ^/dataexportadmin/, role: ROLE_ADMIN } 
     - { path: ^/, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    firewalls: 
     admin_secured: 
      context: site 
      pattern: ^/dataexportadmin/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
       target_path_parameter: redirect_url 
       login_path: /dataexportadmin/login 
       check_path: /dataexportadmin/login_check 
      logout: 
       path: /dataexportadmin/logout 
      anonymous: true 
     main: 
      context: site 
      pattern: ^/dataexport/ 
      form_login: 
       provider: fos_userbundle 
       csrf_token_generator: security.csrf.token_manager 
       target_path_parameter: redirect_url 
       default_target_path: /dataexport/ 
       login_path: /dataexport/login 
       check_path: /dataexport/login_check 
      logout: 
       path: /dataexport/logout 
      anonymous: true 

は、私はまた、2つのファイアウォールを定義しました。そうすることで、私は "ROLE_ADMIN"ロールを持たない "ROLE_EDITORIAL"ロールを持つ既にログインしているユーザーに、別のユーザーとしてログインできるログインフォームを表示するようにしたいと考えています( "ROLE_ADMIN"ロールセットが必要です)。

は、私が2人のユーザーを作成しました:

sudo -u www-data bin/console fos:user:create employee_A 
sudo -u www-data bin/console fos:user:promote employee_A ROLE_EDITORIAL 

sudo -u www-data bin/console fos:user:create employee_B 
sudo -u www-data bin/console fos:user:promote employee_B ROLE_ADMIN 

私の問題「特権の昇格」のこの種が動作しないということです。代わりに、「employee_A」が「データエクスポート」管理領域へのリンクをクリックすると、「403禁止」ページが表示されます。私の計画は代わりにここにログインフォームを表示することです。ログイン(これにより "権限昇格")が失敗した場合、現在ログインしているユーザ "employee_A"の役割 "ROLE_EDITORIAL"を保持する必要があります。 私は、より一般的な方法として、ユーザーemployee_A(ROLE_EDITORIAL)が最初にログアウトし、その後にユーザーemployee_B(ROLE_ADMIN)としてログインすることを知っています。このように、バンドルはすでに動作していますが、私が言ったような一種の「権限昇格」を実装したいと思います。

私の質問は「権限昇格」は「FOSUser bundle」や他のSymfonyユーザ管理バンドルではどうすればいいのですか?

ファイル "config.yml":

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: AppBundle\Entity\FosUser 
    from_email: 
     address: ... 
     sender_name: ... 

ファイル "のrouting.yml":

dataexportadmin_login: 
    path: /dataexportadmin/login 
    defaults: { _controller: MyUserBundle:Security:login } 

dataexportadmin_login_check: 
    path: /dataexportadmin/login_check 
    defaults: { _controller: MyUserBundle:Security:check } 

dataexportadmin_logout: 
    path: /dataexportadmin/logout 
    defaults: { _controller: MyUserBundle:Security:logout } 

dataexport_login: 
    path: /dataexport/login 
    defaults: { _controller: MyUserBundle:Security:login } 

dataexport_login_check: 
    path: /dataexport/login_check 
    defaults: { _controller: MyUserBundle:Security:check } 

dataexport_logout: 
    path: /dataexport/logout 
    defaults: { _controller: MyUserBundle:Security:logout } 

dataexport_admin: 
    resource: "@DataexportBundle/Controller/QueryController.php" 
    type:  annotation 
    prefix: /dataexportadmin 
    options: 
     expose: true 

dataexport: 
    resource: "@DataexportBundle/Controller/DefaultController.php" 
    type:  annotation 
    prefix: /dataexport 
    options: 
     expose: true 

my_user: 
    resource: "@MyUserBundle/Controller/" 
    type:  annotation 
    prefix: /

ファイル "マイ/ UserBundle /コントローラー/ SecurityController.php"

<?php 

namespace My\UserBundle\Controller; 

use FOS\UserBundle\Controller\SecurityController as BaseController; 

class SecurityController extends BaseController 
{ 
    public function renderLogin(array $data) 
    { 
     $requestAttributes = $this->container->get('request_stack')->getCurrentRequest(); 

     if ($requestAttributes->get('_route') === 'dataexportadmin_login') 
     { 
      $template = sprintf('MyUserBundle:Security:adminlogin.html.twig'); 
     } 
     else 
     { 
      $template = sprintf('MyUserBundle:Security:login.html.twig'); 
     } 

     return $this->container->get('templating')->renderResponse($template, $data); 
    } 
} 

2つのTwigテンプレートの相違点は、フォームタグの "action"属性です:

<form action="{{ path("dataexport_login_check") }}" method="post"> 

<form action="{{ path("dataexportadmin_login_check") }}" method="post"> 

ありがとうございました!

答えて

0

FOSユーザーバンドルを使用するのは、認証されているかどうかだけです。 他のユーザーにログインすると、ログインしているユーザーが変更されます。

あなたはdataexportadmin上のセキュリティを変更することがあります。

  1. 下ACCESS_CONTROLレベル
  2. ルートあなたが
  3. は、資格情報をチェックしている場合、$_SESSION['allowd_to_dataexportadmin_until']
  4. に有効期限を設定し、バンドル内のアクションへのフォーム
  5. エクスポートバンドルでは、現在のユーザーがAUTHORISED_ROLES(admin)のロールまたはヌル以外のロール($_SESSION['allowd_to_dataexportadmin_until']、)のいずれかを持っているかどうかを確認するために、

希望します。