2017-02-09 16 views
0

У меня есть контроллер ajax для хранения действий, которые вызываются через AJAX от JS.Symfony 2 - Secure Ajax Controller

Здесь в каждом действии я проверить, если запрос сделан AJAX и никто другие:

if (!$request->isXmlHttpRequest()) { 
    return new JsonResponse(array('message' => 'You can access this only using Ajax!'), 400); 
} 

Теперь проблема в том, что не каждый Аякс действие контроллера должна быть вызваны всеми, а в зависимости от роли зарегистрированный пользователь.

Запрос к действию производится AJAX из JS, но поскольку действия в контроллере я все еще в состоянии получить вход в объект пользователя по $this->getUser() и проверить, если пользователь имеет приемлемую ROLE выполнить действие контроллера по isGranted().

Пример:

if (!$authorizationChecker->isGranted('ROLE_ADMIN')) { 
    return new JsonResponse(array('message' => 'This can be performed only by admin!'), 400); 
} 

Должен ли я проверить ROLES внутри контроллера в каждом действии или попытке настроить access_control для АЯКС маршрутов в security.yml?

Я понятия не имею, в чем большая разница между этими двумя подходами, но хотелось бы знать, какой из них будет более практичным, и может держать мои действия ajax более безопасными.

+0

Пока вы пишете тесты, оба они будут одинаково безопасными. Я имею в виду, что эффект будет таким же. Если вы хотите сделать свои действия менее подробными, вы можете использовать yaml, или вы можете использовать аннотации: http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/security.html – jkrnak

ответ

0

В зависимости от количества AJAX У вас есть контроллеры. Если у вас так много контроллеров, которые должны быть разрешены только для определенной роли, access_control в security.yml - хороший выбор. Иначе вы можете иметь условие в каждом контроллере.

Для динамического уровня разрешений, где разрешение должно быть определено на основе субъектного атрибута (контент для просмотра), вы можете использовать voter.