Проверка подлинности завершается сбоем в Symfony2 - PullRequest
7 голосов
/ 22 сентября 2011

У меня проблемы с установлением аутентификации, но это происходит только в очень определенных обстоятельствах. Аутентификация выполняется через сторонний API, поэтому я написал свой собственный класс провайдера пользователя, и внутри этого класса есть некоторый код, который синхронизирует данные между API и Symfony, и в рамках этого процесса синхронизации он определяет, какие роли должен выполнять пользователь. После этого он устанавливает отношения между ролями и пользователем через отношение ManyToMany.

Метод getRoles () в моем объекте User извлекает объекты ролей из базы данных и превращает его в массив строк, имена ролей берутся из моей базы данных и все начинаются с ROLE _.

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

Я проверил журнал и увидел следующие записи:

security.INFO: User "test105@example.com" has been authenticated successfully [] []
event.DEBUG: Notified event "security.interactive_login" to listener "Pogo\MyBundle\Listener\LoginListener::onSecurityInteractivelogin". [] []
event.DEBUG: Listener "Symfony\Component\Security\Http\Firewall::onKernelRequest" stopped propagation of the event "kernel.request". [] []
event.DEBUG: Listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener" was not called for event "kernel.request". [] []
event.DEBUG: Listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener" was not called for event "kernel.request". [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\Firewall\ContextListener::onKernelResponse". [] []
security.DEBUG: Write SecurityContext in the session [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\SecurityBundle\EventListener\ResponseListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bridge\Monolog\Handler\FirePHPHandler::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\CacheListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". [] []
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onEarlyKernelRequest". [] []
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". [] []
event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] []
security.INFO: Populated SecurityContext with an anonymous Token [] []
event.DEBUG: Notified event "kernel.exception" to listener "Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException". [] []
security.DEBUG: Access denied (user is not fully authenticated); redirecting to authentication entry point [] []
security.DEBUG: Calling Authentication entry point [] []

Я не понимаю, как это может быть аутентифицировано наверху, затем, как только он проверяет брандмауэр, он обнаруживает себя с анонимным токеном, поэтому он, вероятно, возвращает меня обратно на экран входа в систему.

Мои настройки брандмауэра / access_control:

firewalls:
    public:
        pattern: /.*
        anonymous: true
        tessitura_login:
            login_path: /account/login
            check_path: /secure/login_check
        logout:
            path: /secure/logout
            target: /
access_control:
    - { path: ^/secure/.*, role: ROLE_USER }
    - { path: ^/admin.*, role: ROLE_ADMIN }
    - { path: ^/account/login/?, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /.*, role: IS_AUTHENTICATED_ANONYMOUSLY }

Любая помощь с этим была бы в высшей степени признательна, я потратил несколько часов на это сейчас и совершенно ошеломлен.

Ответы [ 6 ]

2 голосов
/ 25 сентября 2015

Возникла эта тихая ошибка, когда использовался номер телефона в качестве имени пользователя и не было указано свойство имени пользователя в методе refreshUser(), который должен быть:

public function refreshUser(UserInterface $customer)
{
    $class = get_class($customer);

    if( !$this->supportsClass($class) ) {
        throw new UnsupportedUserException("Instances of \"{$class}\" are not supported");
    }

    return $this->loadUserByUsername($customer->getPhoneNumber()); // <-- This is it!
}

Я думаю, что я не единственныйкто пропустил, может помочь.

1 голос
/ 09 июля 2013

Повреждение хранилища сессий вызвало это для меня.Я использовал PdoSessionHandler, и, к сожалению, он не дал четкой ошибки или сообщения журнала.

0 голосов
/ 17 февраля 2014

У меня была та же проблема с логином пользователя, я использовал пакет администрирования sonata, и я также использовал сеанс базы данных с PdoSessionHandler

session.handler.pdo:
    class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
    arguments: ["@pdo", %pdo.db_options%]

Первая проблема, которую я получил, когда создавал группу смного ролей / разрешений данные усекаются в поле, поэтому я изменяю поле моих ролей с помощью longtext и изменяю ROW_FORMAT=COMPRESSED

ALTER TABLE  `fos_group` CHANGE `roles` `roles` LONGTEXT NOT NULL COMMENT '(DC2Type:array)'; 
ALTER TABLE `fos_group`
    ENGINE=INNODB
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8;

Это выполняет работу и сохраняет все роли / разрешения в полекак полная сериализованная строка. Но пользователь не смог войти без сообщения об ошибке, тогда я просмотрел журналы, сгенерированные symfony в app/logs dir

Пользователь успешно прошел аутентификацию

и затем перенаправить на панель мониторинга, но с панели мониторинга журналы, сгенерированные как

доступ запрещен (пользователь не полностью аутентифицирован)

причина была в том, что данные сеансаусеченный в таблице сеансов, поэтому я также изменяю свою таблицу сеансов, и это делает работу

ALTER TABLE `session` CHANGE `session_value` `session_value` LONGTEXT NOT NULL; 
ALTER TABLE `session`
    ENGINE=INNODB
    ROW_FORMAT=COMPRESSED 
    KEY_BLOCK_SIZE=8;

Я также обновил файл my.ini и изменил формат файла наBarracuda по умолчанию имеет формат файла antelop

[mysqld]
innodb_file_per_table
innodb_file_format = Barracuda
0 голосов
/ 18 июля 2013

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

Надеюсь, это поможет кому-то сэкономить время; -)

0 голосов
/ 08 марта 2013

Я испытал то же самое.И для меня это было потому, что раздел / tmp был полон, поэтому сеанс можно сохранить на стороне сервера и перенаправить avter на nex

0 голосов
/ 18 декабря 2012

Я испытал то же самое.Когда мои пользователи входят в систему, я проверяю, какую роль он выполняет, с помощью пары таких утверждений:

if(true === $this->get('security.context')->isGranted('ROLE_MANAGER')){
   //return redirect
}
if(true === $this->get('security.context')->isGranted('ROLE_USER')){
   //return redirect
}
//throw error

Время от времени некоторые пользователи получают сообщение об ошибке.Я полагаю, что это по той же причине.Пользователь как-то аутентифицирован, но не получил своей роли.

Я не могу воспроизвести проблему сам.Я только что услышал сообщения об ошибках от моих пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...