我不太确定symfony是如何为不同的用户/视图提供不同形式的可能性的。
据我所知,你有行动:
public function new(Request $request): Response
{
$order = new Orders();
$form = $this->createForm(OrdersType::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
return $this->redirectToRoute('orders_index');
}
return $this->render('orders/new.html.twig', [
'order' => $order,
'form' => $form->createView(),
]);
}生成带有的表单,在本例中为OrdersType。然后视图被加载到new.html.twig文件中。但是一些用户只被允许操作“添加”,它不应该显示计算价格或任何东西的选项。
我该怎么做?
发布于 2018-11-23 05:33:17
解决方案取决于应用程序的结构。
如果计算价格在new.html.twig中,您可以为具有有限访问权限的用户使用另一个文件。
在下面的示例中,"ROLE_RESTRICTED“是用户的角色,只允许添加,而不能看到价格。
例如:
public function new(Request $request): Response
{
$logged_user = $this->get('security.token_storage')->getToken()->getUser();
$order = new Orders();
$form = $this->createForm(OrdersType::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($order);
$em->flush();
return $this->redirectToRoute('orders_index');
}
if($logged_user->hasRole('ROLE_RESTRICTED')){
$view = 'orders/newRestricted.html.twig'
}else{
$view = 'orders/new.html.twig';
}
return $this->render($view , [
'order' => $order,
'form' => $form->createView(),
]);
}如果new.html.twig和newRestricter.html.twig之间的差别很小,你可以只保留一个twig文件,并只创建一些条件区域:
{% if not app.user.hasRole('ROLE_RESTRICTED') %}
<a href="{{path('edit_order')}}">Edit an order</a>
{% else %}不要忘了保护避免直接URL访问对应的路由(在控制器中):
public function edit($id)
{
$logged_user = $this->get('security.token_storage')->getToken()->getUser();
if($logged_user->has_role('ROLE_RESTRICTED')) {
throw $this->createAccessDeniedException('Access denied');
}
// create form, return render, etc.
}事实上,您必须限制对页面或部分视图的访问。您可以在官方文档https://symfony.com/doc/current/security.html的安全部分找到更多详细信息
另一个解决方案是在表单构建器中创建过滤器:
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class OrdersType extends AbstractType
{
private $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$logged_user = $this->tokenStorage->getUser();
if(!$logged_user->hasRole('ROLE_RESTRICTED')){
$builder->add('MyField', TextType::class,array(
'required' => false
));
}
}
...https://stackoverflow.com/questions/53437639
复制相似问题