![](/img/trans.png)
[英]Twig: if is_granted('ROLE_MANAGER') check is not granted
[英]Security Topic - IS is_granted(ROLE_ADMIN) in TWIG enough?
我想知道在树枝中仅执行is_granted(ROLE_ADMIN)是否足以保护表单。
我的意思是任何人都可以使用该表格:
-带有选择选项的一些小部件可供任何人更改。
-仅在授予ROLE_ADMIN的情况下,才会显示其他窗口小部件(有关管理的窗口小部件)。
仅通过ROLE_ADMIN更改这种形式的管理内容就足够安全了吗? 还是我也应该固定控制器。
(确保控制器安全将使我编写更多内容,因为现在只需要执行flush()即可。然后,我将对通过表单请求获得的所有POST进行更多测试)
这取决于您所说的安全性 。 而且,这也取决于您对安全性的定义是否足够 。
以下问题可能会有所帮助:
如果您没有在控制器中保护它,则用户可能会提交一个任意的POST请求,其中包含未在其中显示的字段,如果她正确猜测了字段的名称或在某个地方找到了它们。 因此,我认为,您应该始终仔细检查其是否理智。
你可以:
并在评论中回答您的问题:“如何模拟POST以检查令牌是否足以阻止POST字段,而这些字段实际上并未显示在我的页面中。” 如果您使用Google Chrome进行开发,我可以向您推荐Chrome Advanced Rest Client扩展。 我用它来成功测试我的表格。
因此,总而言之,我认为这个问题并未明确提出,也无法普遍回答。 一切取决于。 但是,如果您想得到一个简单的答案:它不够安全。 隐藏某人的东西并不表示它是安全的。 因此...
这就是我为达到最大安全性的方式(我在这里使用PHP 5.5,因此请确保您拥有它,或者需要进行一些语法调整)。
在您的FormType
,注册一个事件侦听器,例如:
(...)
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('product_id', 'hidden');
(...)
$dynamicFieldCreatorFunc = function (FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if ($this->getContainer()->get('security.context')->isGranted('ROLE_ADMIN'))
{
$form->add('admin_field', 'choice', [
'choices' => [1 => 'Choice 1', 2 => 'Choice 2'],
]);
}
};
$builder->addEventListener(FormEvents::PRE_SET_DATA, $dynamicFieldCreatorFunc);
$builder->addEventListener(FormEvents::PRE_SUBMIT, $dynamicFieldCreatorFunc);
}
然后,如果用户不是管理员,则您的表单将不会生成这些字段。 当然,在Twig中,如果您逐一渲染小部件,则应在渲染它们之前检查该字段的存在:
{% if form.admin_field is defined %}
{{ form_widget(form.admin_field) }}
{% endif %}
或者,在最新的Twig中使用较短的语法
{% form.admin_field is defined ? form_widget(form.admin_field) }}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.