2016-01-20 2 views
3

У меня есть страница с формой и вы хотите узнать, можно ли получить доступ к ней с помощью GET, но только разрешить вход в систему пользователям.Защищенный метод с помощью аннотаций

Я знаю, что это можно сделать в security.yml, но я не уверен, как это сделать с аннотациями.

/** 
    * @param Request $request 
    * @return Response 
    * @Security("has_role('ROLE_USER')") 
    * @Method(methods={"POST"}) 
    */ 
    public function calculatorAction(Request $request) 
    { 

     $form=$this->createForm(new CallRequestType(),$callReq=new CallRequest()); 


     $form->handleRequest($request); 

     if($form->isValid()){ 
      //blabla 
     } 


     return $this->render('MyBundle:Pages:calculator.html.twig', array('form' => $form)); 
    } 

Это обеспечит всю функцию, но я хочу, чтобы получить доступ к нему, просто не POST к нему без входа в систему. В качестве альтернативы можно проверить, есть ли зарегистрированный пользователь в $ форма-> isValid() кронштейн. Но мне все еще интересно, можно ли это сделать с аннотациями.

+1

Немного из точки из question: аннотация '@ Method' рассматривается только тогда, когда действие аннотируется с помощью' @ Route'. – scoolnico

+0

Приятно знать, я этого не знал. –

+1

Я предлагаю вам разделить на два отдельных метода – Matteo

ответ

2

Вы могли бы сделать что-то вроде этого.

Вы можете разрешить оба типа методов анонимно и проверить только внутри контроллера, чтобы проверить, проверен ли пользователь и является ли он POST.

(Вы не указывают, какая версия Symfony вы используете, так что вы, возможно, придется заменить authorization_checker (2.8) для старшего security.context службы)

/** 
* @param Request $request 
* @return Response 
* 
* @Route("/someroute", name="something") 
* @Method(methods={"POST", "GET"}) 
*/ 
public function calculatorAction(Request $request) 
{ 

    if (!$this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY') && $request->getMethod() == 'POST') { 
     throw new AccessDeniedHttpException(); 
    } 


    $form=$this->createForm(new CallRequestType(),$callReq=new CallRequest()); 


    $form->handleRequest($request); 

    // you also need to check submitted or youll fire the validation on every run through. 
    if($form->isSubmitted() && $form->isValid()){ 
     //blabla 
    } 


    return $this->render('MyBundle:Pages:calculator.html.twig', array('form' => $form)); 
} 
+0

authorization_checker доступен еще до 2.8, но да, я использую 2.8. Это то, что я закончил делать. Я искал способ проверить вне контроллера. –

Смежные вопросы