大規模な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">
ありがとうございました!