![](/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.