我使用FOSUser软件包来管理我在我们公司更大的Symfony项目之上为我的同事创建的数据导出包的访问权限。 因此,我创建了一个DataexportBundle,可以从Symfony项目中导出已定义的数据部分。
DataexportBundle提供
"数据导出"下载区域必须受到保护,以便只有员工才能访问它。不允许匿名用户访问此区域。 "数据导出"管理区域只能由具有额外管理员角色的一些员工访问。
因此,我在我的" 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">
感谢您的帮助!
答案 0 :(得分:0)
仅使用FOS用户捆绑包用户是经过身份验证还是未经过身份验证。 如果您登录其他用户,您将更改登录用户。
您可能希望更改/webapps/ROOT/
上的安全性:
dataexportadmin
$_SESSION['allowd_to_dataexportadmin_until']
且低于$_SESSION['allowd_to_dataexportadmin_until']
希望这有帮助