Search code examples
phpsymfonysonata-admin

Putting Security around Sonatas Admin Extensions


I want to add a 'quick publish' function when saving pages in sonata admin - this function needs to be locked down to certain individuals with the correct 'role' or 'permission'.

I initially played around with changing the base template to add a form button and doing it all in the PageAdmin postUpdate/postPersist functions but felt this was a bit too messy.

I have now looked at using an AdminExtension - doing this meant removing the button from the form as I didn't really want to overwrite the template for this one change. To do this i've added a configureFormFields function:

public function configureFormFields(FormMapper $formMapper)
{
    $formMapper->with('Options')
        ->add('quickPublish', 'checkbox', [
            'label' => 'Quick Publish',
            'required' => false,
            'help' => 'Checking this will automatically publish the changes'
        ])
        ->end();

}

I have then added my postPersist and postUpdate functions in here that will make the necessary updates.

public function postPersist(AdminInterface $admin, $object)
{
    if ($object->getQuickPublish()) {
        $this->quickPublish($object);
    }
}

The problem i'm facing is that I only want this admin extension to run based on the security roles not just all the time.

In postPersist and postUpdate it isn't an issue as I can use $admin->isGranted('QUICK_PUBLISH) but $admin isn't available to me in the configureFormFields function.

I can't find a way to put security around the admin extensions, anyone know how this works? I'm using Sonata 2.x

Thanks Kevin


Solution

  • Take a look at the built in Sonata LockExtension

    In the configureFormFields method, you should be able to get the admin object from the FormMapper :

    public function configureFormFields(FormMapper $form)
    {
        $admin = $form->getAdmin();
        //.....
    }
    

    Hope this helps