这些需求laravel 都帮你考虑到了!php
在conf/auth.php 中Guard 能够配置 用户和使用调用中间件(middleware)模式html
它解决了,不一样客户在不一样环境下(api,web,admin) 使用不一样用户角色(前端用户,后端用户)权限认证需求前端
[ 'guards' => [ 'web' => [ //表示使用web中间件下 使用“session 驱动” 驱动位置:vendor\laravel\framework\src\Illuminate\Auth\SessionGuard.php //用户为users --具体定义users模型 在provider中定义 'driver' => 'session', 'provider' => 'users', ], 'api' => [ //表示使用api中间件下 使用“token 驱动” //用户为users --具体定义users模型 在provider中定义
//注意api 没有默认配置 Authenticate 中间件-------须要本身手动在 app/http/kernel.php 中添加 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'admin' => [ //表示使用admin中间件下 使用“session 驱动” //用户为admin --具体定义admin模型 在provider中定义 'driver' => 'session', 'provider' => 'admin', ], ] ]
顺便讲下用户的数据提供者,它只是定义用户类型,还有指定对应的用户模型laravel
[ 'providers' => [ //表示users 用户 使用App\User::class模型做为用户模型 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], //固然还能够配置其余用户,好比admin 后台用户 'admin' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ] ]
Auth::guard('web')->user()
Auth::user();
注:默认配置在 config/auth.phpweb
'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ]
若是是上面的配置,那auth::user() 就至关于 Auth::guard('web')->user();后端
中间件默认在 app\Http\Kernel.php 中注册 有如下数组(规则):api
注册在 $middleware 数组中的中间件 全部路由每次都会调用数组
protected $middleware = [ \App\Http\Middleware\TrustProxies::class, \Fruitcake\Cors\HandleCors::class, \App\Http\Middleware\CheckForMaintenanceMode::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, ];
注册在 $middlewareGroups 数组中的中间件是路由组,一次调用别名其中的中间件都会调用(打包调用)session
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, ];
//经过auth中间件使用其中的 ”admin guard”验证中间件 Route::middleware('auth:admin')->get('/', function () { return view('welcome'); });
说明:auth:admin app
auth 中间件/其中的冒号表明传参,参数为 admin 就是在guard 中注册的 admin 以下:
[ 'admin' => [ //表示使用admin中间件下 使用“session 驱动” //用户为users --具体定义users模型 在provider中定义 'driver' => 'session', 'provider' => 'admin', ] ]
这个auth:admin表明:
我这个路由须要进行用户认证:认证是否为 admin 用户,根据admin 守卫(guard)的配置,将会调用session模块验证用户
laravel 权限认证,所有在Authenticate 中间件完成,默认文件在 \App\Http\Middleware\Authenticate.php
经过kernel (注册于 App\Http\Kernel.php)注入到中间件模块中
它经过guard 模块来实现认证,guard在上面所说的config\auth.php 中注册
在Authenticate 中使用了 guard 模块来验证用户是否登陆:
如下代码片断位于:Illuminate\Auth\Middleware\Authenticate
class Authenticate implements AuthenticatesRequests { /** * The authentication factory instance. * * @var \Illuminate\Contracts\Auth\Factory */ protected $auth; /** * Create a new middleware instance. * * @param \Illuminate\Contracts\Auth\Factory $auth * @return void */ public function __construct(Auth $auth) { $this->auth = $auth; } //... }
当路由组件使用了“auth” 也就是 \App\Http\Middleware\Authenticate::class 中间件时就会触发权限认证
以后的具体操做就有中间件来完成了,好比发现未登陆就跳转到登陆页
在 app/http/Kernel.php 中修改api 中间件的使用,由于默认admin guard 使用的session 驱动,全部须要打开 token,session 中间件的支持
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class,//启用token 中间件 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class,//启用session 中间件 // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class,//验证csrf 中间件 \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ \App\Http\Middleware\EncryptCookies::class,//新增的 启用token \Illuminate\Session\Middleware\StartSession::class,//新增的 启用session 中间件 \App\Http\Middleware\VerifyCsrfToken::class,//新增的 启用csrf 中间件 'throttle:60,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
在路由界面添加须要的路由并在中间件中加上:"admin.auth" 表示使用 admin 权限验证 就ok了
Route::middleware('admin.auth')->get('/company', function (Request $request) { return Company::select(['id',"name as text"])->get(); });
以上均为我的总结,参考网上教程和laravel 相关源码,若有错误和理解问题,欢迎大佬们指正!