2016-11-28 4 views
3

설명서와 마찬가지로 복제 작업을 구현했습니다. 개체를 만든 사용자에게 복제 작업에 대한 액세스를 제한하려면 어떻게합니까?사용자에 따라 사용자 지정 작업을 액세스 할 수 없도록 만드는 방법 - Sonata Admin

내 작업에서 이미 액세스 거부 예외 검사를 받았지만 사용자가 해당 개체의 작성자가 아닌 경우 목록보기에서 단추를 숨길 수는 있습니다. 사용자는 여전히 주문을 나열하고 표시 할 수 있어야합니다. 당신이 내 복제 작업에서 볼 수 있듯이 나는,

public function cloneAction($id = null) 
{ 
    $object = $this->admin->getSubject(); 
    if (!$object) { 
     throw new NotFoundHttpException(sprintf('Unable to find the object with id : %s', $id)); 
    } 

    If (!$object->isAuthor($this->getUser())) { 
     throw new AccessDeniedException(); 
    } 

    $clonedObject = clone $object; 

    $this->admin->create($clonedObject); 
    $this->addFlash('sonata_flash_success', 'Cloned successfully'); 
    return new RedirectResponse($this->admin->generateUrl('edit', array('id' => $clonedObject->getId()))); 
} 

:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $collection->add('clone', $this->getRouterIdParameter().'/clone'); 
} 

그리고 내 목록 필드 :

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->add('_action', 'actions', array(
      'actions' => array(
       'show' => array(), 
       'edit' => array(), 
       'clone' => array(
        'template' => 'AppBundle:Sonata/Button:clone_button.html.twig' 
       ), 
      ), 'label' => 'Actions' 
     )) 
    ; 
} 

내 복제 작업을

내 경로입니다 사용자가 주문의 저자인지 확인하십시오. 하지만 어떻게 내 isAuthor 기능을 확인하여 목록의 버튼을 완전히 제거 할 수 있습니까?

이제 사용자는 버튼을 볼 수 있기 때문에 버튼을 클릭하면 주문을 복제 할 권한이 없으며 버튼을 클릭하면 액세스가 거부 된 예외가 발생합니다. 그래서 버튼을 전혀 보여주고 싶지 않습니다. 편집 단추에 대해 동일한 개수입니다.

protected function configureRoutes(RouteCollection $collection) 
{ 
    $user = $this->getConfigurationPool()->getContainer()->get('security.token_storage') 
      ->getToken()->getUser(); 

    If (!$object->isAuthor($user)) { 
     $collection->remove('edit'); 
     $collection->remove('clone'); 
    } 
} 

을하지만, 분명히이 수행 할 수 없습니다

나는 이런 식의 생각.

아무도 아이디어를 가지고 있지 않습니까?

답변

2

a Symfony Voter을 작성하고 조치에서 점검을 제거하십시오. 수표는 외부의 투표자에서 수행되며, 템플릿을 포함하여 어디서나 수행 할 수 있습니다. 템플릿을 확인해야합니다. 아마도 이미 확인을 수행 할 것입니다.

또한 주제 이외의 도움말은 항상 예외 상황에 대한 메시지를 제공합니다.

throw new AccessDeniedException('Not an author of this object'); 
+0

좋아, 그게 내가 실제로해야 할 일을하게 만들거야. 하지만 이제는 문제가 남아 있습니다. 사용자가 액세스 권한이없는 경우 어떻게 경로를 숨길 수 있습니까? 버튼은 거기에 남아있을 것이고 누군가 클릭하면 예외가 던져 질 것입니다. 사용자가 사용할 수있는 경우에만 단추가 표시되기를 원합니다. 순수한 Symfony로 작업하면 그렇게하는 것이 쉽습니다. 하지만 이제는 소나타를 사용합니다. –

+1

템플릿을 확인하십시오.하지만 말했듯이 이미 체크가되어있을 것입니다. 아니면 직접 템플릿을 작성 했습니까? 'is_granted()'를 경로와 객체와 함께 사용해야하며 유권자를 호출 할 것입니다. – greg0ire

+0

그래서 이것을 해결하고 싶으면 0 번 단계를 찾아서 버튼을위한 템플릿을 보여주세요. – greg0ire