2017-12-18 242 views
1

我正在使用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"> 

感謝您的幫助!

回答

0

使用FOS用戶軟件包只有用戶是否通過身份驗證或不是。 如果您登錄另一個用戶,您將更改登錄的用戶。

你可能想改變dataexportadmin安全:

  1. 低ACCESS_CONTROL水平
  2. 路線的形式在你捆綁
  3. 如果證書檢查,在$_SESSION['allowd_to_dataexportadmin_until']
  4. 設置截止日期行動
  5. 在您的導出包中爲每個動作分派一個事件,以檢查當前用戶是否具有AUTHORISED_ROLES(admin)或非空$_SESSION['allowd_to_dataexportadmin_until']或低於new \DateTime()

希望這會有所幫助