课程内容

用户认证

Laravel 默认内置了用户认证器,提供了多种认证,比如认证,手动验证,uid认证,HTTP 基础认证
,无状态 HTTP 基础认证,api认证等自定义认证器

用户认证

自定义用户名

Laravel 默认使用 email 字段来认证。如果你想使用其他的字段,可以在 LoginController 控制器里面定义一个 username 方法:

public function username()
{
    return 'username';
}

自定义认证器

你还可以自定义用户认证和注册的「看守器」。要实现这一功能,需要在 LoginControllerRegisterControllerResetPasswordController 中定义 guard 方法。该方法会返回一个看守器实例:

use Illuminate\Support\Facades\Auth;

protected function guard()
{
    return Auth::guard('guard-name');
}

获取认证用户

你可以通过 Auth facade 来访问已认证的用户:

use Illuminate\Support\Facades\Auth;

// 获取当前通过认证的用户...
$user = Auth::user();

//  获取当前通过认证的用户 ID...
$id = Auth::id();

    或者,你可以通过 `Illuminate\Http\Request` 实例来访问已认证的用户。别忘了,类型提示的类会被自动注入到你的控制器方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    /**
     * 更新用户资料
     *
     * @param  Request  $request
     * @return Response
     */
    public function update(Request $request)
    {
        // $request->user() 返回一个认证用户实例...
    }
}

确定当前用户是否已经认证

你可以使用 Auth facade 的 check 方法来检查用户是否已认证。如果已认证,将会返回 true

use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // 用户已经登录了...
}
    比如用admin
     if (Auth::guard('admin')->check()) {
    // 用户已经登录了...
}

提示:虽然可以使用 check 方法确认用户是否被认证,但是在允许用户访问的某些路由 / 控制器之前,通常还是会使用中间件来验证用户是否进行过身份验证。想要了解更多信息,请查看有关 保护路由 的文档。

保护路由

路由中间件 可以用于只允许通过认证的用户访问给定的路由。Laravel 自带了一个 auth 中间件,它定义在 Illuminate\Auth\Middleware\Authenticate 中。由于这个中间件已经在 HTTP 内核中注册,你只需把这个中间件附加到路由定义中:

Route::get('profile', function () {
    // 只有认证过的用户可以进入...
})->middleware('auth');

当然,如果你使用 控制器,你可以在控制器的构造函数中调用 middleware 方法来直接将其附加到路由定义中:

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

重定向未认证的用户

auth 中间件检测到一个未认证用户时,它会把用户重定向到名为 login命名路由上。
您可以通过修改 app/Http/Middleware/Authenticate.php 文件中的 redirectTo 函数来修改此行为:

/**
 * Get the path the user should be redirected to.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return string
 */
protected function redirectTo($request)
{
    return route('login');
}

手动验证用户

不一定非要在 Lavarel 中使用验证控制器。如果选择删除这些控制器,就需要直接使用 Lavarel 验证类。别担心,很容易!

可以借助 Auth facade 访问 Laravel 服务,因此需要在类的开头导入 Auth 。下面来看看 attempt 方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    /**
     * Handle an authentication attempt.
     *
     * @param  \Illuminate\Http\Request $request
     *
     * @return Response
     */
    public function authenticate(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // 通过认证..
            return redirect()->intended('dashboard');
        }
    }
}

attempt 方法的每个参数是一个关联数组。数组值用于在数据库中查找用户。在上面的例子中,将通过 email 列的值查找用户。如果找到该用户,将用存储在数据库中的哈希密码与数组中的 password值做比较。不需要对 password 做哈希运算,框架在与数据库中的哈希密码做比较前自动对此值做哈希运算。如果两个哈希值匹配,将为该用户建立验证通过的 session。
如果验证成功, attempt 方法返回 true ,否则返回 false

重定向中的 intended 方法将经由身份验证中间件将用户重定向到身份验证前截获的 URL 。如果预期目标不存在,可以为此方法指定一个回退 URI 。

指定额外条件

除了用户的电子邮件和密码之外,还可以向身份验证查询添加其他条件。例如, 我们可以验证用户是不是已经被标记为 「激活」:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    //验证处于激活状态,并且存在的用户
}

注意:在这些例子中, email 不是必须的选项,它只用来做示范。你应该使用与你的数据库中 「用户名」 对应的列名。

访问指定的看守器实例

可以使用 Auth facade 的 guard方法指定想要使用的看守器实例。这允许你使用完全独立的可验证模型或用户表来管理应用程序各个部分的验证。

传递给 guard 方法的看守器名称需要与 auth.php 配置中的配置项之一相匹配:

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

登出

用户登出需要使用 Auth facade 的 logout 方法。它会清除用户会话(session)中的用户验证信息:

Auth::logout();

记住用户

如果想在应用中提供 「记住我」功能,可以给 attempt 方法传递一个布尔值作为其第二个参数,这会无限期保持用户身份验证,直到用户手动登出。用户表需要包含字符串类型的 remember_token 列用于存储令牌.

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // 用户已经被记住...
}

Tip:如果使用了 Laravel 内置的 LoginController,「记住」用户的正确逻辑已经由控制器所用的 traits 实现。

如果启用了「记住用户」,可以使用 viaRemember 方法判断是否使用了「记住我」cookie 对用户做身份验证

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

其它身份验证方法

验证用户实例

如果要将已经存在的用户登入应用,可以调用 login 方法,并以用户实例作为其参数 。该对象必须实现 Illuminate\Contracts\Auth\Authenticatable 契约 。Laravel 自带的 App\User 模型已经实现了这个接口:

Auth::login($user);
    //如果存在认证器,可以使用
     Auth::guard('admin')->login($user);

// 登录并记住给定用户...
Auth::login($user, true);

使用如下方式指定想要的看守器实例:

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

通过 ID 验证用户身份

可以使用 loginUsingId 方法通过 ID 将用户登录到应用。这个方法接受希望验证身份用户的主键:

Auth::loginUsingId(1);

//登录并记住给定用户...
Auth::loginUsingId(1, true);

仅验证一次用户身份

可以使用 once 方法在单次请求中将用户登录到应用中。这样做将不使用 session 或 cookies,这意味着此方法有助于构建一个无状态 API:

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

默认路由地址

vendor/laravel/framework/src/Illuminate/Routing/Router.php

Auth::routes();

本节课源码

仓库的地址
https://github.com/kong-qi/laravel_study_video_course
下载地址:https://github.com/kong-qi/laravel_study_video_course/releases

评论区 (0)

没有记录
支持 markdown,图片截图粘贴拖拽都可以自动上传。