繁体   English   中英

Laravel 中的多提供者关系用户表

[英]Multi provider relational user table in laravel

我是 laravel 的新手,并试图创建一个身份验证系统,用户可以在其中使用多个提供程序登录/注册,并且每当用户使用任何提供程序登录时,必须相应地显示用户头像和个人资料数据。 使用Auth::user()->providers ,结果是该用户的所有注册提供程序的数组。

我想要的是仅获取当前登录方法的提供者数据(即本地帐户、Facebook 帐户提供者、谷歌帐户提供者等),以便我可以为用户显示来自该确切提供者的数据。

用户名

...
    public function providers()
    {
        return $this->hasMany("App\UserProvider");
    }
...

用户提供者.php

class UserProvider Extends Model
{
    protected $table = 'user_providers';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'user_id', 'provider', 'provider_id','avatar_url', 'token', 'token_secret',
    ];

}

请让我知道我是否走在正确的道路上,或者还有其他方法可以做到这一点。 谢谢!

您可以使用您的关系来构建查询

$provider = Auth::user()->providers()->where('provider', 'facebook')->first();

这将返回单个 UserProvider 类对象

您还可以在user_providers表中包含一个布尔列,以了解最后使用哪个提供程序(因此这将是当前登录方法)。 我们将此列is_current

因此,当用户访问系统时,您更新登录方法,将此字段设置为true 你可以通过覆盖app\\Http\\Controllers\\LoginController控制器的authenticated()方法来做到这一点:

# app\Http\Controllers\LoginController.php

protected function authenticated(Request $request, $user)
{
    Auth::user()
          ->providers()
          ->where('provider', $request->provider) // Change this to make it work
          ->update('is_current', true);
}

这样,您可以随时随地访问当前的登录方法,执行以下操作:

Auth::user()->providers()->whereTrue('is_current')->first();

当然,你可以在你的模型中创建一个访问器来缩短它:

# User.php

public function getCurrentProviderAttribute()
{
    return $this->providers()->where('is_current', true)->first();
}

所以现在,你可以简单地做:

Auth::user()->current_provider;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM