Устаревший сервис 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