已登录用户使用“FOSUser Bundle”的“角色提升”,无需先注销

问题描述 投票:1回答:1

我正在使用FOSUser包来管理我在我们公司的一个更大的Symfony项目之上为我的同事创建的数据导出包的访问权限。因此,我创建了一个DataexportBundle,可以从Symfony项目中导出已定义的数据部分。

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 Forbidden”页面。我的计划是在这里显示登录表单。如果登录(特此是“特权提升”)失败,则必须保留登录用户“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:   /

文件“My / UserBundle / Controller / 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">

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

谢谢你的帮助!

php symfony fosuserbundle
1个回答
0
投票

仅使用FOS用户捆绑包用户是经过身份验证还是不经过身份验证。如果您登录其他用户,您将更改登录用户。

您可能想要更改dataexportadmin上的安全性:

  1. 降低access_control级别
  2. 将表单路由到Bundle中的操作
  3. 如果凭据检查,请在$_SESSION['allowd_to_dataexportadmin_until']中设置到期日期
  4. 在您的导出包中,在每个操作上调度一个事件,以检查当前用户是否具有AUTHORISED_ROLES(admin)或非null $_SESSION['allowd_to_dataexportadmin_until']中的角色,并且低于new \DateTime()

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.