Intereting Posts

Как (правильно) расширить метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate ()?

Я использую модуль ScnSocialAuth ZF2 для включения проверки подлинности в социальных сетях в моем проекте.

Поскольку он использует ZfcUser как одну из своих зависимостей, по умолчанию создаются / используются две таблицы БД:

CREATE TABLE `user` ( `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(255) DEFAULT NULL UNIQUE, `email` VARCHAR(255) DEFAULT NULL UNIQUE, `display_name` VARCHAR(50) DEFAULT NULL, `password` VARCHAR(128) NOT NULL, `state` SMALLINT UNSIGNED ) ENGINE=InnoDB CHARSET="utf8"; 

а также

 CREATE TABLE IF NOT EXISTS `user_provider` ( `user_id` INT NOT NULL, `provider_id` varchar(50) NOT NULL, `provider` varchar(255) NOT NULL, PRIMARY KEY (`user_id`,`provider_id`), UNIQUE KEY (`provider_id`,`provider`), FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ) ENGINE=InnoDB; 

Я хотел бы добавить больше полей в обе таблицы.

Первым шагом было изменение этих таблиц на моем сервере БД.

Затем я переопределяю объекты и классы User и UserProvider (добавляя свойства и их получатели и сеттеры) и настраиваю файлы конфигурации (zfcuser.global.php и scn-social-auth.global.php), чтобы они использовали эти новые сущности. Здесь все работает гладко.

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

Глядя на метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate (), я понял, что при аутентификации пользователя устанавливаются только следующие поля:

 user.email user.password user.display_name user_provider.user_id user_provider.provider_id user_provider.provider 

оставляя мои добавленные поля (например: пол, birth_day, регион и т. д.) пустым.

Еще одна вещь, которую я заметил, проверяя, как работает класс \ ScnSocialAuth \ Authentication \ Adapter \ HybridAuth, заключается в том, что сущности гидратируются «жестко». Например:

 protected function facebookToLocalUser($userProfile) { ... $localUser = $this->instantiateLocalUser(); $localUser->setEmail($userProfile->emailVerified) ->setDisplayName($userProfile->displayName) ->setPassword(__FUNCTION__); $result = $this->insert($localUser, 'facebook', $userProfile); return $localUser; } 

Может ли кто-нибудь объяснить, что является лучшим способом расширить / переопределить метод authenticate (), чтобы я мог установить эти новые поля со значениями из профиля пользователя? Конечно, без изменения исходного метода.

благодаря

Solutions Collecting From Web of "Как (правильно) расширить метод ScnSocialAuth \ Authentication \ Adapter \ HybridAuth :: authenticate ()?"