laravel 用户认证

原文

  1. 路由
    Laravel 提供了一个简单的命令来快速生成身份验证所需的路由和视图:
php artisan make:auth
  1. 自定义用户名
    Laravel 默认使用 email 字段来认证。如果你想用其他字段认证,可以在 LoginController 里面定义一个 username 方法:
public function username()
{
    return 'username';
}
  1. 自定义看守器
    你还可以自定义用于认证和注册用户的「看守器」。要实现这一功能,需要在 LoginController、RegisterController 和 ResetPasswordController 中定义 guard 方法。该方法需要返回一个看守器实例:
use Illuminate\Support\Facades\Auth;

protected function guard()
{
    return Auth::guard('guard-name');
}
  1. 自定义验证/存储
    要修改新用户在应用注册时所需的表单字段,或者自定义如何将新用户存储到数据库中,你可以修改 RegisterController 类。该类负责验证和创建应用的新用户。

RegisterController 的 validator 方法包含了应用验证新用户的规则,你可以按需要自定义该方法。

RegisterController 的 create 方法负责使用 Eloquent ORM 在数据库中创建新的 App\User 记录。你可以根据数据库的需要自定义该方法。

  1. 检索认证用户
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() 返回已认证的用户的实例...
    }
}
  1. 确定当前用户是否认证
    你可以使用 Auth facade 的 check 方法来检查用户是否登录,如果已经认证,将会返回 true:
use Illuminate\Support\Facades\Auth;

if (Auth::check()) {
    // 用户已登录...
}
  1. 保护路由
    路由中间件 用于只允许通过认证的用户访问指定的路由。Laravel 自带了在 Illuminate\Auth\Middleware\Authenticate 中定义的 auth 中间件。由于这个中间件已经在 HTTP 内核中注册,所以只需要将中间件附加到路由定义中:
public function __construct()
{
    $this->middleware('auth');
}

当然,如果使用 控制器,则可以在构造器中调用 middleware 方法来代替在路由中直接定义:

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

8.指定看守器

将 auth 中间件添加到路由时,还需要指定使用哪个看守器来认证用户。指定的看守器对应配置文件 auth.php 中 guards 数组的某个键:
public function __construct()
{
    $this->middleware('auth:api');
}
  1. 登录限制
    Laravel 内置的控制器 LoginController 已经包含了 Illuminate\Foundation\Auth\ThrottlesLogins trait。默认情况下,如果用户在进行几次尝试后仍不能提供正确的凭证,该用户将在一分钟内无法进行登录。这个限制基于用户的用户名/邮件地址和 IP 地址。
  2. 手动认证用户
    当然,不一定要使用 Laravel 内置的认证控制器。如果选择删除这些控制器,你可以直接调用 Laravel 的认证类来管理用户认证。别担心,这简单得很。

我们可以通过 Auth facade 来访问 Laravel 的认证服务,因此需要确认类的顶部引入了 Auth facade。接下来让我们看一下 attempt 方法:

attempt 方法会接受一个键值对数组作为其第一个参数。这个数组的值将用来在数据库表中查找用户。所以在上面的例子中,用户将被 email 字段的值检索。如果用户被找到了,数据库中存储的散列密码将与通过数组传递给方法的散列 password 进行比较。 如果两个散列密码匹配,就会为用户启动一个已认证的会话

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    /**
     * 处理身份认证尝试.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) { //如果认证成功,attempt 方法将返回 true,反之则返回 false。
            // 认证通过...
            return redirect()->intended('dashboard'); //
        }
    }
}
  1. 指定额外条件
    除了用户的电子邮件和密码之外,你还可以向身份验证查询添加额外的条件。例如,我们可能会验证用户是否被标记为「活动」状态:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // 用户处于活动状态,不被暂停,并且存在。
}
  1. 注销用户
Auth::logout();
  1. 记住用户
    如果你想要在应用中提供「记住我」的功能 , 则可以传递一个布尔值作为 attempt 方法的第二个参数,这会使在用户手动注销前一直保持已验证状态。当然,users 数据表必须包含 remember_token 字段,这是用来保存「记住我」的令牌
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // 这个用户被记住了...
}

{tip} 如果你使用 Laravel 内置的 LoginController,则「记住」用户的逻辑已经由控制器使用的 traits 来实现。
如果你「记住」用户,可以使用 viaRemember 方法来检查这个用户是否使用「记住我」 cookie 进行认证:

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

其它认证方法

  1. 验证用户实例
    如果需要将现有用户实例记录到应用,可以使用用户实例调用 login 方法。给定的对象必须实现了 Illuminate\Contracts\Auth\Authenticatable 契约 。当然,Laravel 自带的 App\User 模型已经实现了这个接口:
Auth::login($user);

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

当然,你也可以指定要使用的看守器实例:

Auth::guard('admin')->login($user);
  1. 通过 ID 验证用户
    你可以使用 loginUsingId 方法通过其 ID 将用户记录到应用中。这个方法只接受要验证的用户的主键:
Auth::loginUsingId(1);

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

仅验证用户一次
你可以使用 once 方法将用户记录到单个请求的应用中。不会使用任何会话或 cookies, 这个对于构建无状态的 API 非常的有用:

if (Auth::once($credentials)) {
    //
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值