Не удается запустить сеанс в Symfony2 с помощью UsernamePasswordToken

Я собираюсь сойти с ума из-за ошибки при входе в Symfony2.4 с помощью UsernamePasswordToken...

У меня есть на моем сайте для автоматического входа пользователей с их URL-адресом и хэшем их пользователя. Действие очень простое, и единственное, что я думаю (после некоторых проверок):

$token = new UsernamePasswordToken($user, $user->getPassword(), 'secured_area', $user->getRoles());
$this->get('security.context')->setToken($token);

При этом в некоторых случаях это работает (когда я пытаюсь, это всегда работает...), но в некоторых случаях не работает... В журнале в этом случае говорится:

[2014-10-30 15:47:25] request.INFO: Matched route "_my_route" (parameters: "_controller": "MyController", "url": "my-url", "hash": "2f5fccc7b5fc2d41bbc3e1e469655f24f540e383", "_route": "_my_route") [] []
[2014-10-30 15:47:25] security.INFO: Populated SecurityContext with an anonymous Token [] []
[2014-10-30 15:47:25] security.DEBUG: Write SecurityContext in the session [] []
[2014-10-30 15:47:25] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Failed to start the session because headers have already been sent by "/route/app/bootstrap.php.cache" at line 1365." at /route/app/cache/prod/classes.php line 119 {"exception":"[object] (RuntimeException: Failed to start the session because headers have already been sent by \"/route/app/bootstrap.php.cache\" at line 1365. at /route/app/cache/prod/classes.php:119)"} []
[2014-10-30 15:47:25] security.DEBUG: Write SecurityContext in the session [] []

Почему заголовки уже отправлены? Почему только в некоторых случаях? Кто-нибудь знает частые случаи, когда это происходит?

Я много чего перепробовал: проверить, чтобы перед этим не печатались символы, поменять брандмауэры в security.yml, поместить сессии в файл на диске,...

Я думаю, что все в порядке.

Моя пользовательская сущность:

class MyUser implements UserInterface, \Serializable
{
...
/**
 * Serializes the user.
 *
 * The serialized data have to contain the fields used byt the equals method.
 *
 * @return string
 */
public function serialize()
{
    return serialize(array(
        $this->id,
        $this->password,
        $this->email
    ));
}

/**
 * Unserializes the user.
 *
 * @param string $serialized The serialized string
 *
 * @return void
 */
public function unserialize($serialized)
{
    list(
        $this->id,
        $this->password,
        $this->email
    ) = unserialize($serialized);
}
...

Security.yml

security:
encoders:
    Symfony\Component\Security\Core\User\User: plaintext
    MyProject\PublicBundle\Entity\MyUser:
        algorithm:   sha1
        iterations: 1
        encode_as_base64: false

role_hierarchy:
    ROLE_USER:        ROLE_PENDING
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    main:
        entity: { class: MyProject\PublicBundle\Entity\MyUser, property: email }

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    secured_area:
        pattern:    ^/
        anonymous: ~
        form_login:
            login_path: /login
            check_path: /login_check
            failure_path: /login
            username_parameter: email
            password_parameter: password
            default_target_path: /login-redirect
        logout:
            path:   /logout
            target: /
        remember_me:
            key:      "aSecretKey"
            lifetime: 321408000
            path:     /
            domain:   %domain%

config.yml (секция сеанса была добавлена ​​после первых ошибок)

framework:
secret:          "%secret%"
router:
    resource: "%kernel.root_dir%/config/routing.yml"
    strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
templating:
    engines: ['twig']
default_locale:  "%locale%"
trusted_hosts:   ~
trusted_proxies: ~
session:
    handler_id: session.handler.native_file
    save_path: "%kernel.root_dir%/sessions"
fragments:       ~
http_method_override: true

person aaubets    schedule 30.10.2014    source источник
comment
Можете ли вы также предоставить структуру раздела из config.yml?   -  person s7anley    schedule 31.10.2014
comment
Что находится в /route/app/bootstrap.php.cache в строке 1365.   -  person Chase    schedule 31.10.2014
comment
Я обновил структуру config.yml. Является ли функция sendContent echo: public function sendContent() { echo $this-›content; //1365 вернуть $this; }. Спасибо!   -  person aaubets    schedule 31.10.2014


Ответы (1)


Вероятно, это связано с тем, как вы пытаетесь сохранить токен в сеансе.

Используете ли вы такие услуги, как:

$token = new UsernamePasswordToken($user, $user->getPassword(), 'secured_area', $user->getRoles());
$this->get('security.context')->setToken($token);
$this->get('session')->set('_security_secured_area',serialize($token));

Автоматическая аутентификация пользователя после регистрации

person Chase    schedule 31.10.2014
comment
Спасибо! Я думаю, что это решило проблему. буду продолжать пробовать ти :D - person aaubets; 03.11.2014