我正在使用 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 实体/类(添加属性及其 getter 和 setter)并设置配置文件(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
将我添加的字段(例如:性别、出生日期、地区等)留空。
通过检查 \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() 方法的最佳方法,以便我可以使用用户配置文件中的值设置这些新字段?当然,不用修改原来的方法。
谢谢