Php 如何创建Laravel 5.1自定义身份验证驱动程序?
我正在使用社交名媛进行Laravel身份验证登录。现在我可以从社交名流那里保存用户的数据了。但现在我面临的问题是如何从gmail、github认证用户 经过一些研究,我明白了我需要创建自定义身份验证。我在谷歌上搜索过,但都是Laravel4.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
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'));
});
我们在这里所做的是:
- 我们首先使用
facade来定义Auth
驱动程序socialite
是SocialiteUserProvider
的一个实现UserProvider
是我对AuthService
类的扩展。这个类的构造函数采用的第二个参数是laravel用来获取和设置会话的会话Guard
- 因此,我们基本上告诉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