gpt4 book ai didi

php - 如何创建Laravel 5.1自定义身份验证驱动程序?

转载 作者:可可西里 更新时间:2023-10-31 22:43:56 25 4
gpt4 key购买 nike

我正在使用社交名流进行Laravel身份验证登录。现在,我可以从社交名流中保存用户的数据了。但是现在我面临着如何从gmail,github验证用户身份的问题。

经过一番研究,我了解到我需要创建自定义身份验证。我用谷歌搜索,但所有都是Laravel 4.1主题。如果有任何解决方法,请提供您的答案。

我已经阅读了以下主题,但是我没有怎么做?

http://laravel.com/docs/5.1/authentication#social-authentication

http://laravel.com/docs/5.1/providers

http://laravel-recipes.com/recipes/115/using-your-own-authentication-driver

http://laravel.io/forum/11-04-2014-laravel-5-how-do-i-create-a-custom-auth-in-laravel-5

更新

public function handleProviderCallback() {
$user = Socialite::with('github')->user();
$email=$user->email;
$user_id=$user->id;

//$authUser = User::where('user_id',$user_id)->where('email', $email)->first();
$authUser = $this->findOrCreateUser($user);

if(Auth::login($authUser, true)) {
return Redirect::to('user/UserDashboard');
}
}

private function findOrCreateUser($user) {
if ($authUser = User::where('user_id',$user->id)->first()) {
return $authUser;
}

return User::create([
'user_id' => $user->id,
'name' => $user->nickname,
'email' => $user->email,
'avatar' => $user->avatar
]);
}

最佳答案

This answer is most suited for Laravel 5.1. Please take care if you are in some other version. Also keep in mind that IMHO this is a rather advanced level in Laravel, and hence if you don't fully understand what you are doing, you may end up crashing your application. The solution is not end to end correct. This is just a general guideline of what you need to do in order for this to work.



在Laravel 5.1中添加自定义身份验证驱动程序

提示:此主题的Laravel文档是 here

提示2:在我看来,您提到的最后一个链接非常有用。阅读该链接后,我了解了所有这些内容。

http://laravel.io/forum/11-04-2014-laravel-5-how-do-i-create-a-custom-auth-in-laravel-5

在开始之前,我首先要描述登录流程,这将有助于您理解该过程。 Laravel使用 driver连接到数据库以获取您的记录。 laravel已预先捆绑了两个驱动程序- eloquentdatabase。我们想要创建第三个,以便我们可以根据需要对其进行自定义。

供应商文件夹中的 Illuminate\Auth\Guard是主文件,其中包含供用户登录和注销的代码。这个文件主要使用两个 Contracts (or interfaces),我们需要重写它们以使驱动程序正常工作。从Laravel自己的文档中读取以下内容:

The Illuminate\Contracts\Auth\UserProvider implementations are only responsible for fetching a Illuminate\Contracts\Auth\Authenticatable implementation out of a persistent storage system, such as MySQL, Riak, etc. These two interfaces allow the Laravel authentication mechanisms to continue functioning regardless of how the user data is stored or what type of class is used to represent it.



因此,想法是要使我们的驱动程序正常工作,我们需要实现 Illuminate\Contracts\Auth\UserProviderIlluminate\Contracts\Auth\Authenticatable并告诉Laravel使用这些实现而不是默认设置。

因此,让我们开始吧。

Step 1:
为您的驱动程序选择一个名称。我命名为 socialite。然后在 config/auth.php中,将 driver名称更改为 socialite。通过这样做,我们只是告诉laravel使用此驱动程序进行身份验证,而不是使用默认的 eloquent

Step 2:
app/Provider/AuthServiceProvider方法的 boot()中,添加以下行:
Auth::extend('socialite', function($app) {
$provider = new SocialiteUserProvider();
return new AuthService($provider, App::make('session.store'));
});

我们在这里所做的是:
  • 我们首先使用Auth门面来定义socialite驱动程序。
  • SocialiteUserProviderUserProvider的实现。
  • AuthServiceGuard类的扩展。此类的构造函数采用的第二个参数是laravel用于获取和设置 session 的 session 。
  • 因此,我们基本上告诉Laravel使用我们自己的Guard类实现,而不是默认的实现。

  • Step 3:
    创建 SocialiteUserProvider。如果您阅读Laravel的文档,您将了解这些方法中的每种方法应返回的内容。我创建了第一个方法作为示例。如您所见,我使用 UserService类来获取结果。您可以获取自己的结果,但是要获取它们。然后,我用它创建了一个 User对象。该 User类实现 Illuminate\Contracts\Auth\Authenticatable契约(Contract)。
    <?php
    namespace App\Extensions;

    use App\User;
    use App\Services\UserService;
    use Illuminate\Contracts\Auth\Authenticatable;
    use Illuminate\Contracts\Auth\UserProvider;

    class SocialiteUserProvider implements UserProvider
    {
    private $userService;

    public function __construct(UserService $userService)
    {
    $this->userService = $userService;
    }

    public function retrieveById($identifier)
    {
    $result = $this->userService->getUserByEmail($identifier);
    if(count($result) === 0)
    {
    $user = null;
    }
    else
    {
    $user = new User($result[0]);
    }

    return $user;
    }

    public function retrieveByToken($identifier, $token)
    {
    // Implement your own.
    }

    public function updateRememberToken(Authenticatable $user, $token)
    {
    // Implement your own.
    }

    public function retrieveByCredentials(array $credentials)
    {
    // Implement your own.
    }

    public function validateCredentials(Authenticatable $user, array $credentials)
    {
    // Implement your own.
    }
    }

    Step 4:
    创建实现 UserAuthenticatable类。该类必须实现此接口(interface),因为 Guard类将使用该类获取值。
    <?php
    namespace App;

    use Illuminate\Contracts\Auth\Authenticatable;

    class User implements Authenticatable
    {
    protected $primaryKey = 'userEmail';
    protected $attributes = [];

    public function __construct(array $attributes)
    {
    $this->attributes = $attributes;
    }

    public function getUserAttributes()
    {
    return $this->attributes;
    }

    public function getAuthIdentifier()
    {
    return $this->attributes[$this->primaryKey];
    }

    public function getAuthPassword()
    {
    // Implement your own.
    }

    public function getRememberToken()
    {
    // Implement your own.
    }

    public function setRememberToken($value)
    {
    // Implement your own.
    }

    public function getRememberTokenName()
    {
    // Implement your own.
    }
    }

    Step 5:
    最后,创建AuthService类,该类将调用 Guard方法。这是我自己的实现。您可以根据自己的需要编写自己的文件。我们在这里所做的是扩展了 Guard类,以实现两个可以自我解释的新功能。
    <?php
    namespace App\Services;

    use Illuminate\Auth\Guard;

    class AuthService extends Guard
    {
    public function signin($email)
    {
    $credentials = array('email' => $email);
    $this->fireAttemptEvent($credentials, false, true);
    $this->lastAttempted = $user = $this->provider->retrieveById($email);

    if($user !== null)
    {
    $this->login($user, false);
    return true;
    }
    else
    {
    return false;
    }
    }

    public function signout()
    {
    $this->clearUserDataFromStorage();

    if(isset($this->events))
    {
    $this->events->fire('auth.logout', [$this->user()]);
    }

    $this->user = null;
    $this->loggedOut = true;
    }
    }

    Step 6: Bonus Step
    为了完成我的答案,我还将解释 UserService类期望的结构。首先让我们了解此类的作用。在上述步骤中,我们创建了所有内容,以使laravel知道如何使用我们的身份验证驱动程序,而不是他们的身份验证驱动程序。但是我们仍然没有告诉laravel它应该如何获取数据。我们所有告诉laravel,如果您调用 userService->getUserByEmail($email)方法,您将获取数据。因此,现在我们只需要实现此功能。

    例如1您正在使用Eloquent
    public function getUserByEmail($email)
    {
    return UserModel::where('email', $email)->get();
    }

    例如2您正在使用Fluent
    public function getUserByEmail($email)
    {
    return DB::table('myusertable')->where('email', '=', $email)->get();
    }

    更新:2016年6月19日

    感谢@skittles指出我没有清楚地显示 应该放置文件的位置。 将按照给定的命名空间放置所有文件。例如。如果 namespace 是 App\Extensions,并且类名是 SocialiteUserProvider,则文件的位置是 App\Extensions\SocialiteUserProvider.php。 laravel中的 App目录是 app文件夹。

    关于php - 如何创建Laravel 5.1自定义身份验证驱动程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243363/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com