"角色提升"已经登录的用户使用" FOSUser Bundle"没有先退出

时间:2017-12-18 11:19:37

标签: php symfony fosuserbundle

我使用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

我的问题是这种"特权提升"不起作用;相反," 403 Forbidden"页面显示在" employee_A"点击指向"数据导出"的链接管理区域。我的计划是在这里显示登录表单。如果登录(特此是"特权提升")失败,则角色" ROLE_EDITORIAL"登录用户" employee_A"必须保持。 我知道更通常的方法是用户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:   /

File" 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模板之间的相关差异是&#34; action&#34;表单标签的属性:

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

VS

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

您可能希望更改/webapps/ROOT/上的安全性:

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

    希望这有帮助