2016-03-02 171 views
3

我正在使用sonatadmin进行symfony 2项目。有时管理员用户可能会意外删除他自己的帐户。如何防止管理员用户删除他自己的帐户?谢谢!SonataAdmin:防止管理员删除自己的帐户

+0

这可能帮助https://sonata-project.org/bundles/admin/2-3/doc/reference/batch_actions.html您可以ovveride模板,如果去掉复选框行中的用户是admin –

+0

我尝试了类似的东西。但有一点是用户仍然可以在帐户编辑页面中删除他的帐户。所以我可能需要修改一些代码 – fallcool

回答

3

为了防止管理员通过以下ADVANCED CONFIGURATION

admin:     # Admin Classes 
    user: 
     class:   Sonata\UserBundle\Admin\Entity\UserAdmin 
     controller:  YourUserBundle:CRUD 
     translation: SonataUserBundle 

,然后在你的控制器覆盖删除自己的帐户,你需要定义自己的CRUDController索纳塔用户在这些功能batchActionDelete() & deleteAction()功能检查,如果请求包含管理对象/ id然后在这里限制。对于batchActionDelete()功能

0

我与FOSUserBundle一起使用SonataUserBundle和

public function deleteAction($id) 
    { 
     $id  = $this->get('request')->get($this->admin->getIdParameter()); 
     $object = $this->admin->getObject($id); 

     if (!$object) { 
      throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id)); 
     } 
     $userid = $this->getUser()->getId() // get id of logged in user 
     if($userid == $id){ 
       $this->addFlash(
        'sonata_flash_error', 
        'Error you cannot delete your own account' 
       ); 
      return $this->redirectTo($object); 
     } 
    // other code from base class 

    } 

同样的逻辑我结束了以下解决方案。

config.yml:

parameters: 
    sonata.user.admin.user.controller: AppBundle:CRUD\CRUD 

的appbundle \控制器\ CRUD \ CRUDController:

<?php 

namespace AppBundle\Controller\CRUD; 

use Sonata\AdminBundle\Controller\CRUDController as Controller; 
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 

class CRUDController extends Controller 
{ 
    public function deleteAction($id) 
    { 
     $request = $this->getRequest(); 
     $id  = $request->get($this->admin->getIdParameter()); 
     $object = $this->admin->getObject($id); 

     if (!$object) { 
      throw $this->createNotFoundException(sprintf('unable to find the object with id: %s', $id)); 
     } 

     $currentUserId = $this->getUser()->getId(); // ID of the current user 
     if ($currentUserId == $id) { 
      $this->addFlash(
       'sonata_flash_error', 
       'You cannot delete your own account.' 
      ); 

      return $this->redirectTo($object); 
     } 

     return parent::deleteAction($id); 
    } 

    public function batchActionDelete(ProxyQueryInterface $query) 
    { 
     $request  = $this->getRequest(); 
     $currentUserId = $this->getUser()->getId(); // ID of the current user 
     $selectedUsers = $query->execute(); 

     foreach ($selectedUsers as $selectedUser) { 
      if ($selectedUser->getId() == $currentUserId) { 
       $this->addFlash(
        'sonata_flash_error', 
        'You cannot delete your own account.' 
       ); 

       return new RedirectResponse(
        $this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters())) 
       ); 
      } 
     } 

     return parent::batchActionDelete($query); 
    } 
} 

参考文献:

相关问题