提问者:小点点

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


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

经过一些研究,我明白了我需要创建自定义身份验证。我在谷歌上搜索过,但都是Laravel4.1的主题。如果有人对此进行了研究,请提供您的答案。

我已经阅读了以下主题,但我不知道如何做?

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

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
    ]);
}

共2个答案

匿名用户

这个答案最适合Laravel 5.1。请注意,如果你是在其他版本。还要记住,恕我直言,这在Laravel中是一个相当高级的级别,因此如果你不完全理解你在做什么,你可能最终会崩溃你的应用程序。解决方案不是端到端正确的。这只是你需要做什么的一般指导方针,以便这一工作。

提示:此主题的Laravel文档在这里。

提示2:我认为你提到的最后一个链接非常有用。我是在读了那个链接后才知道这一切的。

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

在我们开始之前,我想首先描述一下登录流程,这将有助于您理解这个过程。Laravel使用驱动程序连接到数据库以获取记录。两个驱动程序预先捆绑了laravel-雄辩的

在供应商文件夹中照亮\Auth\Guard是主文件,其中包含用户登录和注销的代码。这个文件主要使用两个合同(或接口),我们需要覆盖它们,以便驱动程序工作。从Laravel自己的留档读到:

Lightlight\Contracts\Auth\UserProvider实现仅负责从持久性存储系统(如MySQL、Riak、,这两个接口允许Laravel身份验证机制继续运行,而不管用户数据是如何存储的,或者使用什么类型的类来表示它。

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

所以让我们开始吧。

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

步骤2:在你的应用程序/提供商/AuthService提供商中的引导()方法中添加以下行:

Auth::extend('socialite', function($app) {
    $provider = new SocialiteUserProvider();
    return new AuthService($provider, App::make('session.store'));
});

我们在这里所做的是:

  • 我们首先使用Authfacade来定义socialite驱动程序

步骤3:创建SocialiteUserProvider。如果您阅读了Laravel的文档,您将了解这些方法中的每一个应该返回什么。我创建了第一个方法作为示例。如您所见,我使用UserService类获取结果。您可以获取自己的结果,无论您想要获取它们。然后我用它创建了一个User对象。这个User类实现illumb\Contracts\Auth\Authenticatable契约。

<?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.
    }
}

步骤4:创建User类,该类实现了可验证的。这个类必须实现这个接口,因为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.
    }
}

步骤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;
    }
}

步骤6:奖励步骤为了完成我的回答,我还将解释UserService类所期望的结构。首先让我们了解这个类做什么。在上述步骤中,我们创建了所有内容,让laravel知道如何使用我们的身份验证驱动程序,而不是他们的。但我们还没有告诉拉威尔它应该如何获得数据。我们告诉laravel如果你调用用户服务-

你正在使用Eloquent

public function getUserByEmail($email)
{
    return UserModel::where('email', $email)->get();
}

例如,你正在使用Fluent

public function getUserByEmail($email)
{
    return DB::table('myusertable')->where('email', '=', $email)->get();
}

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

匿名用户

在这里建立laravel社会名流的好教程:https://mattstauffer.co/blog/using-github-authentication-for-login-with-laravel-socialite

Auth::login不返回布尔值,您可以使用它尝试执行Auth::trunt

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

按照教程进行操作,只需在主路径上配置中间件即可

$authUser = $this->findOrCreateUser($user);

Auth::login($authUser, true);

return Redirect::to('home');