2016-10-27 8 views
0

SonataUserBundle 없이는 SonataAdminBundle 을 사용하고 있지만 FOSUserBundle 만 사용하고 있습니다. 이유는 Symfony 3를 사용하기 때문이며 SonataUserBundle은 거기서 작동하지 않습니다.소나타 관리자 용 역할

이제 24 개의 관리 서비스가 있습니다. 사용자가 새 사용자를 만들 수 없으며 다른 사용자의 프로필을 수정할 수 없도록 하나의 Admin 클래스 만 수정해야합니다. 수퍼 관리자 만이 그렇게 할 수 있습니다.

하지만 24 명의 관리자 역할을 이와 같이 작성해야한다는 의미입니까?

ROLE_OPTICKS_ACCESS: 
    - ROLE_SONATA_ADMIN_FOO_LIST 
    - ROLE_SONATA_ADMIN_FOO_VIEW 
    - ROLE_SONATA_ADMIN_FOO_CREATE 
    - ROLE_SONATA_ADMIN_FOO_EDIT 
    - ROLE_SONATA_ADMIN_FOO_DELETE 
    - ROLE_SONATA_ADMIN_FOO_EXPORT 

그러면 security.yml에 약 144 줄의이 줄이 생깁니다. 그런 다음 ROLE_SONATA_ADMIN_USER_CREATEROLE_SONATA_ADMIN_USER_EDIT이라는 두 줄을 제거한 다음 자신의 프로필 만 편집 할 수있는 방법을 찾아냅니다.

아무도 도와 드릴 수 있습니까? 이것을하는 것이 최선의 방법입니까? 내가 제대로하고 있니?

나는 이런 식으로 생각하고 있었기 때문에;

protected function configureRoutes(RouteCollection $collection) 
{ 
    $securityContext = $this->getConfigurationPool()->getContainer()->get('security.authorization_checker'); 

    if (!$securityContext->isGranted('ROLE_SUPER_ADMIN')) { 
     $collection->remove('create'); 
     $collection->remove('edit'); 
    } 
} 

분명히 나는 ​​잘못된 방향으로하고 있는데, 오류가 발생한다.

토큰 저장소에 인증 토큰이 없습니다. 가능한 한 이유는이 URL에 대해 구성된 방화벽이 없다는 것일 수 있습니다.

제발, 필사적으로 도움이 필요합니다.

답변

0

당신이이 서비스

sonata_admin: 
    security: 
     handler: app.security.handler 

자신의 보안 핸들러를 구현할 수 있으며, 당신은 ROLE_SONATA_ADMIN_FOO 역할을하고있는 어떤 것 이런 식으로 자신의 isGranded 방법

public function isGranted(AdminInterface $admin, $attributes, $object = null) 
{ 
    if ($admin instanceof FooAdmin) { 
     return $this->securityChecker->isGranted("ROLE_SONATA_ADMIN_FOO"); 
    } 
} 

를 구현해야 FooAdmin으로 anythins을 만들 수 있습니다. 물론 스케치 일뿐입니다. 더 복잡한 논리를 구현할 수도 있습니다.