我正在使用FOSUser捆綁管理我爲我的同事在更大的Symfony項目之上創建的數據導出包的訪問我們公司的。 因此我創建了一個DataExportBundle,可以從Symfony項目中導出定義的數據部分。已登錄的用戶使用「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
正如你所看到的,我也定義了兩個防火牆。通過這樣做,我希望實現已登錄的具有「ROLE_EDITORIAL」角色(不具有「ROLE_ADMIN」角色)的用戶顯示的登錄表單,他可以作爲另一個用戶(必須具有「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);
}
}
兩個Twig模板之間的相關區別是表單標記的「action」屬性:
<form action="{{ path("dataexport_login_check") }}" method="post">
vs.
<form action="{{ path("dataexportadmin_login_check") }}" method="post">
感謝您的幫助!