Authentication(认证) 和 Authorization(授权) 的不同

Authentication(认证) 意味着验证你是谁,验证你在该系统中是谁。这包括登录和退出的过程,并且允许你使用在使用应用程序的过程中识别自己的身份的任何工具。

Authorization(授权) 是指判断 已经验证身份的用户是否允许(授权)执行特定行为.

你是我班级的学生, 这是认证; 你是我班的学生,并且是班长,可以收作业(特定行为). 这是授权.

默认 User 模型 和 迁移

默认 laravel 提供 create_users_table 迁移和 App\User 模型, 开箱即用.

laravel 提供 Artisan make:auth 命令来生成一个认证相关的视图和路由集合.

Laravel’s default User model

  1. <?php
  2. namespace App;
  3. use Illuminate\Contracts\Auth\MustVerifyEmail;
  4. use Illuminate\Foundation\Auth\User as Authenticatable;
  5. use Illuminate\Notifications\Notifiable;
  6. class User extends Authenticatable
  7. {
  8. use Notifiable;
  9. /**
  10. * The attributes that are mass assignable.
  11. *
  12. * @var array
  13. */
  14. protected $fillable = [
  15. 'name', 'email', 'password',
  16. ];
  17. /**
  18. * The attributes that should be hidden for arrays.
  19. *
  20. * @var array
  21. */
  22. protected $hidden = [
  23. 'password', 'remember_token',
  24. ];
  25. /**
  26. * The attributes that should be cast to native types.
  27. *
  28. * @var array
  29. */
  30. protected $casts = [
  31. 'email_verified_at' => 'datetime',
  32. ];
  33. }

// Illuminate\Foundation\Auth\Use

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\MustVerifyEmail;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\Access\Authorizable;

class User extends Model implements
    AuthenticatableContract,
    AuthorizableContract,
    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail;
}

从模型中可以看出

  1. users 是基于 users 表的, laravel根据模型名称推断出, 我们创建用户时可以填充的字段有 name, email, password, 当我们要以 json 的形式返回 user 时, passwordremembe_token 是被隐藏的.
  2. Illuminate\Foundation\Auth\User 中有很多约定/接口(contracts/Interfaces)和 trait ,我们可以用于其他模型.
  3. Authenticatable contract 需要一个方法(e.g., getAuthIdentifier() ) 来认证本模型的实例, Authenticatable trait 提供了contract所需要的必要方法.
  4. 其余类似, Authorizable contract 需要一个方法 (can() ), 来判断授权(模型实例链接不同内容的权限), Authorizable trait 提供了这些方法.
  5. CanResetPassword contract 和 CanResetPassword trait 也类似.

至此, 我们可以很轻易的表达数据库(经迁移的)的单个用户, 只需要拉出来一个模型实例即可, 这个模型是可以认证(登录和登出)的,可以授权(校验对特定资源的访问权限)的,而且也可以发送密码重置邮件.

auth() 和 Auth Facade

auth() 是检查身份认证状态最简单的方式. 你也可以注入一个 Illuminate\Auth\AuthManager 实例, 或者使用 Auth facade.

  • auth()->check() 是否登录, return true: 登录
  • auth()->guest() 是否是游客, return true: 未登录
  • auth()->user() / auth()->id() 返回登录用户 / 返回登录用户ID , return null: 未登录

例子:

public function dashboard()
{
    if (auth()->guest()) {
        return redirect('sign-up');
    }

    return view('dashboard')->with('user', auth()->user());
}