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

Php 如何创建Laravel 5.1自定义身份验证驱动程序?,php,laravel,laravel-5,laravel-5.1,Php,Laravel,Laravel 5,Laravel 5.1,我正在使用社交名媛进行Laravel身份验证登录。现在我可以从社交名流那里保存用户的数据了。但现在我面临的问题是如何从gmail、github认证用户 经过一些研究,我明白了我需要创建自定义身份验证。我在谷歌上搜索过,但都是Laravel4.1的主题。如果有人对此进行了研究,请提供您的答案 我已经阅读了以下主题,但我不知道如何做 更新 public function handleProviderCallback() { $user = Socialite::with('githu

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

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

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

更新

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

在这里设置laravel社交名流的好教程:

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

if(Auth::login($authUser, true)) {
    return Redirect::to('user/UserDashboard');
}
按照教程进行操作,只需在主路径上配置中间件即可

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

Auth::login($authUser, true);

return Redirect::to('home');
这个答案最适用于Laravel 5.1。如果你不小心,请小心 是另一个版本。另外请记住,IMHO这是Laravel的一个相当高级的级别,因此,如果您不完全了解您正在做什么,您可能会导致应用程序崩溃。解决方案不是端到端正确的。这只是一个一般的指导方针,你需要做什么,以使这项工作

在Laravel 5.1中添加自定义身份验证驱动程序 提示:此主题的Laravel文档是

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


在我们开始之前,我想首先描述一下登录流程,它将帮助您理解这个过程。Laravel使用
驱动程序
连接到数据库以获取记录。两个驱动程序预装了laravel-
Elount
&
数据库
。我们想创建第三个,以便根据需要定制它

illumb\Auth\Guard
在供应商文件夹中是一个主文件,其中包含供用户登录和注销的代码。这个文件主要使用两个
契约(或接口)
,我们需要覆盖它们才能让驱动程序工作。从Laravel自己的文档中阅读以下内容:

Illumb\Contracts\Auth\UserProvider实现仅适用于 负责获取Illumb\Contracts\Auth\Authenticatable 在持久性存储系统(如MySQL)之外实现, Riak等。这两个接口允许Laravel身份验证 无论用户数据如何显示,都可以继续运行的机制 存储或使用什么类型的类来表示它

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


那么让我们开始吧。

public function getUserByEmail($email)
{
    return UserModel::where('email', $email)->get();
}
public function getUserByEmail($email)
{
    return DB::table('myusertable')->where('email', '=', $email)->get();
}
步骤1:
为您的驱动程序选择一个名称。我把我的名字命名为社交名流。然后在
config/auth.php
中,将
驱动程序
名称更改为
社交名流
。通过这样做,我们只是告诉laravel使用此驱动程序进行身份验证,而不是默认的
elount

第二步:
app/Provider/AuthServiceProvider
中的
boot()
方法中添加以下行:

Auth::extend('socialite', function($app) {
    $provider = new SocialiteUserProvider();
    return new AuthService($provider, App::make('session.store'));
});
我们在这里所做的是:

  • 我们首先使用
    Auth
    facade来定义
    socialite
    驱动程序
  • SocialiteUserProvider
    UserProvider
    的一个实现
  • AuthService
    是我对
    Guard
    类的扩展。这个类的构造函数采用的第二个参数是laravel用来获取和设置会话的会话
  • 因此,我们基本上告诉Laravel使用我们自己的
    Guard
    类实现,而不是默认的实现
第三步:
创建
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.
    }
}
第五步:
最后创建将调用
Guard
方法的AuthService类。这是我自己的实现。你可以根据需要自己写。我们在这里所做的是扩展
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;
    }
}
例2您正在使用
Fluent

public function getUserByEmail($email)
{
    return UserModel::where('email', $email)->get();
}
public function getUserByEmail($email)
{
    return DB::table('myusertable')->where('email', '=', $email)->get();
}
更新:2016年6月19日
感谢@skittles指出,我没有清楚地显示文件应该放置的位置。所有文件都将按照给定的名称空间放置。例如,如果名称空间为
App\Extensions
,类名为
SocialiteUserProvider
,则文件位置为
App\Extensions\SocialiteUserProvider.php
。laravel中的
App
目录是
App
文件夹。

@nathanmac。登录后将返回空白页。您认为为什么需要创建自定义身份验证?Socialite有Google和GitHub的驱动程序。@MartinBean。我是laravel的新手。我可以保存数据,但现在我面临如何进行身份验证的问题。您能给我们展示一下您的UserService类吗?这是使你的答案完整所缺少的唯一东西。@LastTemplar您好。我已经更新了我的答案,应该适合你的需要。不幸的是,我无法添加自己的UserService类,因为我使用了几层代码来获取数据。我使用存储库模式。但对你来说,这应该是我在我的例子中所展示的。如果你需要更多的信息,请告诉我。快乐编码@鲁莽-你的a