已登录的用户使用“FOSUser Bundle”而不先登出的“角色提升”

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

感谢您的帮助!

回答:

使用FOS用户软件包只有用户是否通过身份验证或不是。 如果您登录另一个用户,您将更改登录的用户。

你可能想改变dataexportadmin安全:

  1. 低ACCESS_CONTROL水平
  2. 路线的形式在你捆绑
  3. 如果证书检查,在$_SESSION['allowd_to_dataexportadmin_until']
  4. 设置截止日期行动

  5. 在您的导出包中为每个动作分派一个事件,以检查当前用户是否具有AUTHORISED_ROLES(admin)或非空$_SESSION['allowd_to_dataexportadmin_until']或低于new \DateTime()

希望这会有所帮助

以上是 已登录的用户使用“FOSUser Bundle”而不先登出的“角色提升” 的全部内容, 来源链接: utcz.com/qa/262871.html

回到顶部