首页 文章

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

提问于
浏览
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">

谢谢你的帮助!

1 回答

  • 0

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

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

    • 降低access_control级别

    • 将表单路由到Bundle中的操作

    • 如果凭据检查,请在 $_SESSION['allowd_to_dataexportadmin_until'] 中设置到期日期

    • 在导出包中,在每个操作上调度一个事件,以检查当前用户是否具有AUTHORISED_ROLES(admin)或非空 $_SESSION['allowd_to_dataexportadmin_until'] 且低于 new \DateTime() 的角色

    希望这可以帮助

相关问题