Что я должен добавить для обеспечения безопасного и безопасного входа и выхода?
Для входа в систему я просто получил и подтвердил информацию из базы данных, затем я установил Session и Cookie:
if ($users) { //$users - fetched array of users
foreach ($users as $user) {
$response->headers->setCookie(new Cookie('user', $cookie, $expire, $path = '/', $domain = '', $secure = false, $httpOnly = false));
$response->sendHeaders();
foreach ($user as $key => $value) {
//setting every user information to session except password
$session->set($key, $value);
}
}
}
А для выхода из системы я просто удаляю сессии и cookie:
$response->headers->clearCookie('user');
$response->sendHeaders();
$request->getSession()->invalidate();
Значение ‘user’, которое я установил для cookie, генерируется:
$password = $user['password']; //is already in md5
$username = $user['email'];
$cookie = base64_encode ("$username:" . md5 ($password));
Все это сохраняется в главном контроллере.
Это действительно не очень хороший способ для реализации входа и выхода из системы. Взгляните на учебник по безопасности Symfony2. Используйте UserProvider, чтобы получить пользователя из базы данных и установить маркер безопасности в случае успеха.
Для начала — http://symfony.com/doc/current/cookbook/security/custom_provider.html
Функция MD5 больше не безопасна. Если хотите, используйте что-то более сильное, чем это, для кодирования паролей вместе с солью.
Вы можете программно входить и выходить из системы, например, если вы внедрили провайдера и репозиторий пользователей, как описано в Поваренная книга Symfony.
Ниже приведен пример реализации:
Авторизоваться:
$username = $user['email'];
$password = $user['password']; // NOTE: must be plain-text at this point
$User = $this->container->get('doctrine')->getManager()
->getRepository('TixysBackendBundle:User')
->findOneBy(array('login' => $username));
if (!$User) throw \Exception("User not found!");
$factory = $this->container->get('security.encoder_factory');
$encoder = $factory->getEncoder($User);
$password = $encoder->encodePassword($password, $User->getSalt());
if ($password != $User->getPassword())
throw new \Exception("Wrong password.");
// actual login
$token = new UsernamePasswordToken($User, null, 'secured_area', $User->getRoles());
$this->container->get('security.context')->setToken($token);
Выйти:
$this->container->get('security.context')->setToken(null);
$this->container->get('session')->invalidate();
// If you've stored an instance of the previously authenticated user
// somewhere, destroy that instance, too.
Вам не нужно заботиться о реальных алгоритмах хеширования на данном этапе, учитывая, что ваша установка в app/config/security.yml
сделано правильно.