MySQLlaravel 基础教程 —— 认证

自定义 验证/存储

你也许会想要在用户注册时存储一些此外必要的表单字段,进而将猛增用户的音讯存储到数据库中,这些时候你就须要修改
AuthController 类了,这些类首席执行官用户的创设和表单的认证。

AuthController 类中应用 validate
方法来声明验证表单与认证规则的卓殊程度。你可以按照本人的要求来修改那些艺术。

AuthController 类中使用 create
方法用来在数据库中新增一条用户的笔录。这里运用了 Eloquent
ORM。你可以按照自己的要求修改那些措施。

定制

定制化认证守卫

auth.php 配置文件中,你可以配备各个”guards”,用于对各类用户表执行认证动作。你可以在 PasswordController
中使用 $guard 属性来接纳守卫:

/**
 * The authentication guard that should be used.
 *
 * @var string
 */
 protected $guard = 'admins';

定制化密码经纪人

auth.php
配置文件中,你能够布署多样密码“brokers”,用于对多种用户表进行密码重置。你可以因而在
PasswordController 中添加 $broker 属性来选用:

/**
 * The password broker that should be used.
 *
 * @var string
 */
 protected $broker = 'admins';

添加自定义的守护

你可以在劳动容器中应用 Auth 假面的 extend 方法来定义自己的印证守卫:

<?php

namespace App\Providers;

use Auth;
use App\Services\Auth\JwtGuard;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
  /**
   * Perform post-registration booting of services.
   *
   * @return void
   */
   public function boot()
   {
     Auth::extend('jwt', function($app, $name, array $config) {
       // Return an instance of Illuminate\Contracts\Auth\Guard...

       return new JwtGuard(Auth::createUserProvider($config['provider']));
     });
   }

   /**
    * Register bindings in the container.
    *
    * @return void
    */
    public function register()
    {
      //
    }
}

您应有能从地点的言传身教中观察,你应该在 extend 方法中回到一个
Illuminate\Contracts\Auth\Guard
的贯彻。为了定制化守卫你须求贯彻那几个接口所包涵的艺术。

只要你的防卫被定义,你就足以在 auth.php 配置文件的 guards
选项中开展布局:

'guards' => [
  'api' => [
    'driver' => 'jwt',
    'provider' => 'users'
  ],
];

其余认证方法

进展求证

近来您曾经持有了表达相关的控制器、路由和视图,你的拔取已经有所了登记和认证的能力。你可以通过浏览器访问你的运用,认证控制器已经包罗了拥有的求证用户和存储用户到数据库的法门(通过
traits)。

FastCGI 提示

借使你利用 PHP 法斯特CGI,基于 HTTP 的印证可能或不能够正常干活。你可以品尝在
.htaccess 文件中添加如下内容:

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

通过用户ID直接证实

您可以利用 loginUseingId 方法来因而 ID
记录用户的消息,该办法简便的吸纳一个亟待开展求证的用户的主键:

Auth::loginUsingId(1);

点名守卫

当您附加 auth 中间件到路由时,你也可以指定接纳哪个守卫去提供讲明:

Route::get('profile', [
  'middleware' => 'auth:api',
  'uses' => 'ProfileController@show'
]);

所指定的防守应该与布署文件 auth.php 中的 guards 数组键之一相匹配。

基于 HTTP 的认证

据悉 HTTP
的印证提供了飞速的用户认证机制而不用设立专门的报到页面。为了开端,你应当附加
auth.basic 中间件到您的路由。laravel 中內建了 auth.basic
中间件,所以你不须要去定义它:

Route::get('profile', ['middleware' => 'auth.basic', function () {
  // Only authenticated users may enter... 
}]);

假诺该中间件被增大到路由中,你每一趟访问该路由时都会被提示需要验证音信。默许的,auth.basic
中间件使用 email 列作为用户记录的用户名。

表达节流

一旦您利用了 laravel 內建的 AuthController 类,那么
Illuminate\Foundation\Auth\ThrottlesLogins trait
可以被用来界定用户尝试登陆的次数。默许的,当用户举办登陆数十次失利时,其将会在一分钟内不能够进展登陆。节流是基于用户的
username / e-mail 和 IP 地址来判定的:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
  use AuthenticatesAndRegistersUsers, ThrottlesLogins;

  // Rest of AuthController class...
}

用户提供者契约

Illuminate\Contracts\Auth\UserProvider
的落到实处仅仅只是管理怎么样从持续存储系统中取得一个
Illuminate\Contracts\Auth\Authenticatable 的落到实处。如
MySQL,Riak,等等。那几个五个接口落成了 laravel
的源源不断认证机制而不须要考虑用户数量是存放在哪个地方了照旧存放的是怎样类型。

让大家来看一下 Illuminate\Contracts\Auth\UserProvider 契约:

<?php

namespace Illuminate\Contracts\Auth;

interface UserProvider {
  public function retrieveById($identifier);
  public function retrieveByToken($identifier, $token);
  public function updateRememberToken(Authenticatable $user, $token);
  public function retrieveByCredentials(array $credentials);
  public function validateCredentials(Authenticatable $user, array $credentials);
}

retrieveById 方法用来收纳一个键来再次回到一个用户,如 MySQL
数据库中自增的主键 ID。被匹配的 ID 应该回到一个 Authenticatable
的实现。

retrieveByToken 方法接收用于识别用户身份的绝无仅有标识 $identifier
remember_token 所存储“记住我”的
$token。似乎上面的艺术一致,该方法应该回到一个 Authenticatable
的实现。

updateRememberToken 方法应用新的 $token 来更新用户的
remember_token 字段。那几个新的字段可以是用户登录成功还要安装了 记住我
而分红的,也足以是用户登出之后分配的 null。

retrieveByCredentials
方法接收一个数组凭证,它会在用户尝试登录时将凭证传递给 Auth::attemp
方法。该方法会询问底层持续存储设备凭证的合作景况,一般该形式会利用
where 条件语句来展开查询 $credentials['username']
类似的匹配现象。这些方法应该回到一个 UserInterface
的实现。不用在这一个办法里做密码验证或者评释

validateCredentials
方法应该比较所给定的用户和证据的同盟景况。比如,这些格局恐怕会比较
$user-getAuthPassword()Hash::make 后的
$credentials['password']。这么些办法应该只做用户和证据间的效应和再次回到比较景况的布尔值。

自定义守卫

你也得以定制化 guard 用来表明用户。你须要在 AuthController 中定义
guard 属性。它的值应该是与您的 auth.php 配置中的某一个 guards
值相匹配的:

protected $guard = 'admin';

事件

laravel 在表明进度中提供了各类各个的轩然大波。你可以在您的
EventServiceProvider 中附加监听这一个事件:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
 protected $listen = [
  'Illuminate\Auth\Events\Attempting' => [
    'App\Listeners\LogAuthenticationAttempt',
  ],

  'Illuminate\Auth\Events\Login' => [
    'App\Listeners\LogSuccessfulLogin',
  ],

  'Illuminate\Auth\Events\logout' => [
    'App\Listeners\logSuccessfulLogout',
  ],

  'Illuminate\Auth\Events\Lockout' => [
    'App\Listeners\LogLockout',
  ],
 ];

视图

就好像上边所关联的,php artisan make:auth
命令会创造所有认证相关的视图,并且保留在 resources/views/auth 目录下。

make:auth 命令也会创制 resoucres/views/layouts
目录,并在该目录下为运用创建了一个宗旨的布局。所有的那么些视图都是拔取了
Bootstrap CSS 框架,你可以依照自身的需求去定制化修改。

简介

laravel
使执行认证的变得格外简单,事实上,它提供了老大健全的陈设项以适应应用的政工。认证的配置文件存放在
config/auth.php
目录,那里的各样选项都提供了一揽子的笺注文档,你可以从这里调整认证服务的行事。

在 laravel 中,认证服务的为主是由 guards(守卫)
providers(供应商)
组成。守卫定义了从呼吁中验证用户的点子,比如说,laravel 自带了 session
守卫和 token 守卫,session 守卫是从所蕴藏的对话及 cookies
中去注解请求中的用户的,而 token 守卫则是从请求中的 API token
进行用户认证的。

供应商则定义了从持久化存储中取得用户的点子。laravel 自身提供了
Eloquentdatabase
查询构造器三种检索格局。当然,你也足以添加额外的供应商去做这么些。

倘若那听起来有些零乱,请不要担心。半数以上的应用程序是一贯不需求修改认证服务的默许配置音讯的。

视图

make:auth 命令被实施时,laravel
会生成所有密码重置所须求的视图。那么些视图将被存放在在
resources/views/auth/passwords 目录中,你可以根据自己的须要去修改。

难忘用户

若是你想要在你的施用中提供 记住我 的法力,你只须要在 attempt
方法中传送一个布尔值作为第三个参数,那将保持用户的印证音信直到用户手动的退出登录。当然,那要求你的用户表中必须包蕴
remember_token 列:

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
  // The user is being remembered...
}

设若您作为被记住的用户登录的,那么你可以应用 viaRemember
方法来判定用户的印证是或不是由此 记住我 的 cookie:

if (Auth::viaRemember()) {
  //
}

添加自定义的用户提供者

万一你并从未使用传统的关周全据库来储存你的用户,那么你必要提供你协调的用户提供者来增加laravel。你可以通过运用 Auth 假面的 provider
方法来定义自己的用户提供者。你应该在劳动提供者中调用该方法:

<?php

namespace App\Providers;

use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
  /**
   * Perform post-registration booting of services.
   *
   * @return void
   */
  public function boot()
  {
    Auth::provider('riak', function($app, array $config) {
      // Return an instance of Illuminate\Contracts\Auth\UserProvider...
      return new RiakUserProvider($app['riak.connection']);
    });
  }

  /**
   * Rigster bindings in the container.
   *
   * @return void
   */
   public function register()
   {
     //
   }
}

在您使用 provider 方法注册成功提供者之后,你需要在 config/auth.php
配置文件中切换你的用户提供者为新注册的提供者:

'providers' => [
  'users' => [
    'driver' => 'riak',
  ],
],

下一场,你必要在 guards 选项中接纳该提供者:

'guards' => [
  'web' => [
    'driver' => 'session',
    'provider' => 'users',
  ],
],

判断当前用户是还是不是已被证实

您可以由此 Auth 假面的 check
方法来判定当前用户是还是不是业已被验证。假使该用户已经被认证则会回到 true:

if (Auth::check()) {
  // The user is logged in...
}

你应有运用中间件来过滤未被认证的用户访问一些路由或控制器。

自定义重定向地址

当用户通过认证后会被重定向到 / URL。你可以透过在 AuthController
控制器中定义 redirectTo 属性来修改重定向地址:

protected $rediredtTo = '/home';

当用户并未注脚成功,它会重定向回登录地址。

点名额外的求证音讯

假设您要求,你也得以伸张部分附加条件做表达查询,比如,你须求讲明被标记为
‘active’ 的用户:

if (Auht::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
  // The user is active, not suspended, and exists.
}

专注,在地点的事例中 email
并不是必备的选项,那仅仅只是作为一个示范。你能够采纳任何进展用户认证的凭据来映射数据库中的字段。

获取已证实的用户

您可以通过 Auth 假面来走访已经表明的用户:

$user = Auth::user();

别的,一旦用户通过验证,你可以经过 Illuminate\Http\Request
的实例来访问经过认证后的用户。你应有记得,类型提醒的类会被电动的注入到你的控制器方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
  /**
   * Update the user's profile
   *
   * @param Request $request
   * @return Response
   */
   public function updateProfile(Request $request)
   {
     if ($request->user()) {
       // $request->user() returns an instance of the authenticated user...
     }
   }
}

仅认证用户三次

once 方法只在现阶段乞求中举行用户认证。不会储存会话或
cookies。那对打造无状态的 API 很有赞助。once 方法和 attempt
具有同样的签证情势:

if (Auth::once($credentials)) {
  //
}

登出

你可以行使 Auth 假面的 logout
方法来举行用户的淡出,该格局将消除用户认证的对话音讯:

Auth::logout();

透过用户实例举行求证

如果你须要在行使中著录一个一度存在的用户实例,你能够动用 login
方法。所给定的参数必须是达成了
Illuminate\Contracts\Auth\Authenticatable 契约的一个实例。当然,在
laravel 中 App\User 模型已经落实了这一个接口:

Auth::login($user);

理所当然,你也可以指定守卫实例:

Auth::guard('admin')->login($user);

密码重置

敏捷开端

laravel 装载了七个用来开展表达的控制器,它们存储在
App\Http\Controllers\Auth 命名空间下。AuthController
用来拍卖用户注册及表达的逻辑,而 PasswordController
包罗了用户找回密码的相关逻辑。它们每个控制器都是透过引入 trait
来含有他们所需求的方法。对于绝大部分施用来说,你是一点一滴没有须要去修改这一个控制器的。

路由

laravel 提供了一个便捷的法门来变化认证的路由和视图的脚手架,你可以行使
artisan 命令:

php artisan make:auth

在一个新的使用中,这些命令会用来开展设置注册和登录的视图,也会注入所有的印证相关的路由。HomeController
也会被转移。这些控制器提供了 post
登录请求的处理格局。你也足以依照自己的须要删除或改动那几个控制器。

可表达的(Authenticatable)契约

刚才我们追究了 UserProvider 中的所有办法,现在让大家来看一看
Authenticatable 契约,你应该记得,提供者应该从 retrieveById
retrieveByCredentials 方法中回到该契约接口的达成:

<?php

namespace Illuminate\Contracts\Auth;

interface Authenticatable {
  public function getAuthIdentifierName();
  public function getAuthIdentifier();
  public function getAuthPassword();
  public function getRememberToken();
  public function setRememberToken($value);
  public function getRememberTokenName();
}

其一接口相对来说极度简单。getAuthIdentifierName
方法应该回到用户的主键字段的称呼。getAuthIdentifier
方法应该回到用户的主键。在 MySQL
中,那些主键一般为自增进的主键值。getAuthPassword
应该回到用户的经哈希后的密码。那个接口使认证种类能够在任何用户类中运作而不用管你选取的是怎样ORM 或者其余存储抽象层。默许的,laravel 在 app 目录下富含了 User
类,该类就落到实处了这几个契约。所以你可以参见这些类的兑现形式。

路由

laravel 自带的 Auth\PasswordController
控制器包蕴了富有重置密码所需的逻辑。所有提供密码重置的路由都得以经过
make:auth Artisan 命令来扭转:

php artisan make:auth

保养路由

路由中间件可以被用来界定唯有已经被评释的用户才能访问所给定的路由。laravel
自带了 auth 中间件,该中间件被定义在
app\Http\Middleware\Authenticate.php
文件中。你只须求在定义路由时增大上该中间件就可以了:

// Using A Route Closure...

Route::get('profile', ['middleware' => 'auth', function () {
  // Only authenticated users may enter... 
}]);

// Using A Controller...

Route::get('profile', [
  'middleware' => 'auth',
  'uses' => 'ProfileController@show'
]);

自然,假设您拔取控制器来注册路由,你可以在控制器的构造函数中选拔
middleware 方法来附加中间件:

public function __construct()
{
  $this->middleware('auth');
}

无状态的 HTTP 基本注明

你也足以在动用 HTTP 基本注明时不拔取 session 保存用户的地位到
cookie。那在依照 API
的阐明更加有效。为了成功这么些,你可以定义一个中间件,然后调用 onceBasic
方法。如果 onceBasic 方法没有回来响应,那么请求将被愈来愈传递到利用:

<?php

namespace Illuminate\Auth\Middleware;

use Auth;
use Closure;

class AuthenticateOnceWithBasicAuth
{
  /**
   * Handle on incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
   public function handle($request, Closure $next)
   {
     return Auth::onceBasic() ?: $next($request);
   }
}

紧接着,在路由中附加中间件:

Route::get('api/user', ['middleware' => 'auth.basic.once', function () {
  // Only authenticated users may enter... 
}]);

理所当然,你还需求在 kernel.php 焦点中登记该中间件。

做客指定的防守实例

您可以使用 Auth 假面的 guard
方法来赢得你所急需的守护实例。那使您可以在同一个行使中管理各类认证模型或用户表,并贯彻独立的求证。

guard 方法中所传递的防守名称应当与配置文件 auth.php 中 guards
之一相匹配:

if (Auth::guard('admin')->attempt($credentials)) {
  //
}

数据库注意事项

多数的使用都提供了一种用户重置其忘记密码的主意。laravel
提供了一种便民的法门来发送密码提醒和提供密码重置,那样您就不须求被迫在各种应用都落到实处三次那种机制。

为了便利起来,请确定你的 App\User 模型完成了
Illuminate\Contracts\Auth\CanResetPassword 契约,laravel 中自带的
App\User 模型中早就已毕了这一个借口,并且利用了
Illuminate\Auth\Passwords\CanResetPassword trait。

通过搬迁生成密码重置表

随之,必须求创立一个用来存储重置密码的 token 的表。laravel
已经提供了那种表的迁徙,并且存放在 database/migrations
目录下,所以,你只须求实践迁移命令:

php artisan migrate

数据库注意事项

默认的,laravel 在 app 目录下富含了 App\User Eloquent
模型。该模型使用了默认的 Eloquent 认证驱动。若是您的选择不是使用
Eloquent 驱动,你可以使用 database 认证驱动,database 认证驱动是根据laravel 的询问构造器的。

当你为 App\User 模型去打造数据库表结构时,你应当肯定密码应该保证最少
60 个字符的长短,默许的 255 是一个比较好的挑三拣四。

除此以外,你要求确保 users 表中涵盖了一个方可为 null 的字符串列
remember_token,它应有具备 100
个字符的长度。那几个字段是用来存储用户保持深切登录的 token
值的。你可以在搬迁中行使 $table->rememberToken() 来急迅的丰盛该列。

手动进行用户认证

理所当然,你没有需要肯定使用 laravel
內建的表明控制器。若是您选拔删除那一个验证控制器,那么你需求直接的行使
laravel 认证类来保管用户的认证。别担心,那当然不在话下。

俺们将透过 Auth 假面来走访 laravel
的表明服务,所以,我们要有限支撑在类公事的顶部引入 Auth
假面。接着,让我们查阅一下 attempt 方法:

<?php

namespace App\Http\Controllers;

use Auth;

class AuthController extends Controller
{
  /**
   * Handle an authentication attempt.
   *
   * @return Response
   */
   public function authenticate()
   {
     if (Auth::attempt(['email' => $email, 'password' => $password])) {
       // Authentication passed... 
       return redirect()->intended('dashboard');
     }
   }
}

attempt
方法接收一个键值对数组来作为第二个参数。数组中的值用来在数据库中查找相匹配的用户。所以,在地方的事例中,会回去匹配到
email 列为 $email
的用户。假如用户被找到,存储在数据库中的哈希后的密码会和数组中通过哈希加密的
password
值举行匹配。即使多个哈希后的值卓越成功的话,就会敞开一个该用户已经认证的对话。

如果证实成功,则 attempt 方法会重回 true。否则重临 false

intended 方法用来回到给重定向器用户在登录前所想要前往的 URL
地址,该方法也接受一个参数作为所请求地址不可用时的备用地址。

重置密码然后

借使您生成了富有重置密码所要求的路由和视图之后,你就足以由此在浏览器访问
/password/reset 路由来进行密码重置。PasswordController
已经包罗了发送重置密码的链接邮件及立异密码到数据库的功效。

当密码被重置之后,用户会活动登录并且被重定向到 /home。你能够在
PasswordController 中定义 redirectTo 属性来定制化重定向地址:

protected $redirectTo = '/dashboard';

瞩目,默许的,密码重置的 token 有效期唯有一个时辰,你可以在
config/auth.php 配置文件中修改 expire 选项。

网站地图xml地图