我正在使用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 回答
仅使用FOS用户捆绑包用户是经过身份验证还是未经过身份验证 . 如果您登录其他用户,您将更改登录用户 .
您可能想要更改
dataexportadmin
上的安全性:降低access_control级别
将表单路由到Bundle中的操作
如果凭据检查,请在
$_SESSION['allowd_to_dataexportadmin_until']
中设置到期日期在导出包中,在每个操作上调度一个事件,以检查当前用户是否具有AUTHORISED_ROLES(admin)或非空
$_SESSION['allowd_to_dataexportadmin_until']
且低于new \DateTime()
的角色希望这可以帮助