Я использую Symfony2.3 вместе со своим встроенным инструментом PDOSessionHandler для хранения сеансов в базе данных. По какой-то причине кажется, что в каждом запросе записывается несколько сеансов, и из-за этого у меня возникают проблемы при входе в систему. Вот моя конфигурация сеанса PDO:
parameters:
pdo.db_options:
db_table: Session
db_id_col: id
db_data_col: session_value
db_time_col: session_time
services:
pdo:
class: PDO
arguments:
dsn: "mysql:host=%database_host%;port=%database_port%;dbname=%database_name%"
user: %database_user%
password: %database_password%
calls:
- [ setAttribute, [3, 2] ] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION
session.handler.pdo:
class: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
arguments:
- "@pdo"
- "%pdo.db_options%"
Скажем, я делаю один запрос GET на https://acme.mybundle.com/app_dev.php в качестве анонимного пользователя. Затем это пример вывода, который я увижу в таблице Session
:
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| id | session_value | session_time |
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
| 1 | X3NmMl9hdHRyaWJ1dGVzfGE6MTp7czozNDoiX3NlY3VyaXR5LnNlY3VyZWRfYXJlYS50YXJnZXRfcGF0aCI7czozODoiaHR0cHM6Ly9hbGxlbmNvLmRldi5hdmF0YXJuZXd5b3JrLmNvbS8iO31fc2YyX2ZsYXNoZXN8YTowOnt9X3NmMl9tZXRhfGE6Mzp7czoxOiJ1IjtpOjE0MTU2MjU4ODQ7czoxOiJjIjtpOjE0MTU2MjU4ODQ7czoxOiJsIjtzOjE6IjAiO30= | 1415625884 |
| 2 | X3NmMl9hdHRyaWJ1dGVzfGE6MDp7fV9zZjJfZmxhc2hlc3xhOjA6e31fc2YyX21ldGF8YTozOntzOjE6InUiO2k6MTQxNTYyNTg4NDtzOjE6ImMiO2k6MTQxNTYyNTg4NDtzOjE6ImwiO3M6MToiMCI7fQ== | 1415625884 |
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------+
Если вам это нужно, вот мой файл security.yml
:
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
Acme\MyBundle\Entity\User: sha512
providers:
main:
id: acme.user.provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_firewall:
pattern: ^/login$
security: false
secured_area:
pattern: ^/
form_login: ~
logout:
path: /logout
target: /
access_control:
- { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
- { path: ^/, roles: ROLE_USER, requires_channel: https }
После 1-5 попыток я обычно могу войти в систему, и для любых будущих запросов больше не создаются сеансы. Наконец, наш сервер находится за прокси-сервером, если это имеет значение. Кто-нибудь знает, почему несколько Списков записываются в каждом Запросе? Благодарю!
Оказывается, проблема связана с моей сущностью ORM Session
. У меня была следующая запись для $id
:
<?php
namespace Acme\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Session
*
* @ORM\Table()
* @ORM\Entity
*/
class Session
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
//...
}
Идентификатор сессии $id
не должен быть целым числом - это должна быть строка (очевидно, она также не должна быть автоматически увеличена. У меня было много derps после обнаружения этой ошибки). После перезаписи записи $id
моего класса:
/**
* @var string
*
* @ORM\Column(type="string", length=255)
* @ORM\Id
*/
private $id;
и запуск php app/console doctrine:schema:update --force
, все работает правильно.