Новое в Symfony 2.6: Улучшение компонент безопасности

Устаревший сервис security.context

Это одно из основных изменений, вносимых Symfony 2.6. К счастью, это не повлияет на ваши приложения, потому что мы сохранили обратную совместимость. В любом случае, чтобы подготовиться к будущим версиям Symfony, вы должны начать изучать новый метод работы с компонентом безопасности.

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

В результате дискуссий в сообществе, было решено, что SecurityContext имеет слишком много зависимостей для получения простого объекта Token/User. Вот почему, начиная с Symfony 2.6, сервис security.context  является устаревшим и разделен на два новых сервиса: security.authorization_checker и security.token_storage.

Так как подразумевается 100% обратная совместимость, вам не придется переписывать код ваших приложений. Тем не менее, в случае, если вы хотите сделать это, изменения будут небольшими:

// Symfony 2.5
$user = $this->get('security.context')->getToken()->getUser();
// Symfony 2.6
$user = $this->get('security.token_storage')->getToken()->getUser();

// Symfony 2.5
if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) { ... }
// Symfony 2.6
if (false === $this->get('security.authorization_checker')->isGranted('ROLE_ADMIN')) { ... }

В качестве дополнительного бонуса, константы, связанные с безопасностью теперь короче и гораздо проще запомнить:

// Symfony 2.5
use Symfony\Component\Security\Core\SecurityContextInterface;
if ($security->has(SecurityContextInterface::AUTHENTICATION_ERROR)) { ... }

// Symfony 2.6
use Symfony\Component\Security\Core\Security;
if ($security->has(Security::AUTHENTICATION_ERROR)) { ... }

Наконец, это изменение также уменьшает значимость глобальной переменной app.security для шаблонов Twig. Вы должны использовать вместо глобальной переменной app.user функцию is_granted ().

Новый сервис для упрощения шифрования пароля 

В результате в DX предложения # 11299, Symfony 2.6 представит новый сервис security.password_encoder  для упрощения кодирования пароля:

// Symfony 2.5
$user = new Acme\UserBundle\Entity\User();
$factory = $this->container->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$password = $encoder->encodePassword($plainTextPassword, $user->getSalt());

// Symfony 2.6
$user = new Acme\UserBundle\Entity\User();
$encoder = $this->container->get('security.password_encoder');
$password = $encoder->encodePassword($user, $plainTextPassword);

Добавлен слушатель на основе REMOTE_USER для брандмауэра безопасности

Несколько модулей безопасности Apache (auth_kerb, auth_cas и т.д.) обеспечивают аутентификацию через переменную окружения под названием REMOTE_USER. По этой причине, Symfony 2.6 будет включать в себя новый слушатель для аутентификации на основе этой переменной.

Чтобы использовать его в вашем приложении, просто укажите межсетевой экран нового типа remote_user в конфигурации безопасности:

# app/config/security.yml
security:
    firewalls:
        secured_area:
            pattern: ^/
            remote_user:
                provider: your_user_provider

Добавлен хелпер для ошибки безопасности

Кастомизация логин формы в приложениях Symfony делается довольно просто, но требует слишком много кода:

// Symfony 2.5
public function loginAction(Request $request)
{
    $session = $request->getSession();

    if ($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
        $error = $request->attributes->get(
            SecurityContextInterface::AUTHENTICATION_ERROR
        );
    } elseif (null !== $session && $session->has(SecurityContextInterface::AUTHENTICATION_ERROR)) {
        $error = $session->get(SecurityContextInterface::AUTHENTICATION_ERROR);
        $session->remove(SecurityContextInterface::AUTHENTICATION_ERROR);
    } else {
        $error = '';
    }

    $lastUsername = (null === $session) ? '' : $session->get(SecurityContextInterface::LAST_USERNAME);

    return $this->render(
        'AcmeSecurityBundle:Security:login.html.twig',
        array(
            'last_username' => $lastUsername,
            'error'         => $error,
        )
    );
}

В результате в DX предложение # 11147 Symfony 2.6 будет включать в себя новый помощник позволяющий резко сократить объем кода, используемого для логин форм:

// Symfony 2.6
public function loginAction()
{
    $helper = $this->get('security.authentication_utils');

    return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
        'last_username' => $helper->getLastUsername(),
        'error'         => $helper->getLastAuthenticationError(),
    ));
}

Источник: http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+symfony%2Fblog+%28Symfony+Blog%29

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

20 − два =