2013-12-17 49 views
0

我們是在一個項目,該項目看起來有點像這樣運行:Symfony2的奏鳴曲管理員捆綁爲「前端」

客戶可以登錄,使他們能夠編輯信息的ControlPanel控制。 他們編輯的信息將通過其他軟件通過REST API提取(這已經在以前的版本中有效)。

其實我們的應用程序的基礎實際上與SonataAdminBundle相同。但據我所知,我不能過濾的SonataAdminBundle查看的數據由用戶登錄

例如:

  • 用戶1用戶2用戶3來自員工客戶1。他們只需要看看他們添加的所有數據從customer1表
  • 當一個新的客戶顧客2被添加到系統中的一些用戶也創造User10User11。他們只需要通過只使用SonataAdminBundle看到有關顧客2信息,而不是由customer1表(或相反)的添加信息

這可能嗎?或者我們是否需要創建自己的軟件?

我知道我們必須創造所有不同的許多關係,但這不是問題。主要問題是,我可以通過當前登錄的用戶過濾數據嗎?當以管理員或超級管理員身份登錄時,不需要應用數據過濾器。

在此先感謝!

回答

0

是的,只能使用SonataAdminBundle。

首先,用戶通過不同的列表視圖訪問數據,因此您需要重寫Admin類的createQuery方法以顯示正確的Customer。

(不要忘了注入@ security.context服務)

public function createQuery($context = 'list') 
{ 
    $query = parent::createQuery($context); 

    if (!$this->isGranted('ROLE_SUPER_ADMIN') || !$this->isGranted('ROLE_ADMIN')) 
    { 
     $user = $this->securityContext->getToken()->getUser(); 

     $query-> 
      // your custom query. 
     ; 
    } 

    return $query; 
} 

然後,你需要securise所有其他行動(顯示,編輯和刪除),以防止用戶訪問到其他客戶。

爲此,我重寫了我的Controller的操作,並在調用父方法之前添加了自己的邏輯。

public function editAction($id = null) 
{ 
    // check if the user can access to the current customer 
    // if not throw new AccessDeniedException(); 

    return parent::editAction($id); 
} 

也許還有更好的方法..

+0

但是很多事情只能通過ACL的是不可能的?我找到了一個可能做我想要的(https:// github。com/coopTilleuls/CoopTilleulsAclSonataAdminExtensionBundle) 但我認爲我的安全性不足,因爲我只在普通用戶具有角色時才獲取儀表板中的實體:ROLE_ADMIN 當用戶具有角色:ROLE_USER和ROLE_ [BUNDLENAME] _ [ENTITY] _ [GUEST/STAFF/EDITOR/ADMIN]那麼我想我應該可以查看實體列表,但我什麼都看不到。 – Leroy

+0

所有用戶都需要具有ROLE_ADMIN和ROLE_SONATA_ADMIN角色,否則他們將無法使用奏鳴曲。 無法將訪問權限限制爲具有角色或acl的特定條目,您只能爲整個實體設置權限。 – rpg600

相關問題