1.你的应用可能:分为前端用户和后端管理用户。
2.你的应用可能:既是传统php渲染的html 应用,同时也为其他应用(如:安卓手机应用)提供api接口服务。
这些需求laravel 都帮你考虑到了!
在conf/auth.php 中Guard 可以配置 用户和使用调用中间件(middleware)模式
它解决了,不同客户在不同环境下(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 驱动”
//用户为users --具体定义users模型 在provider中定义
'driver' => 'session',
'provider' => 'admin',
],
]
]
顺便讲下用户的数据提供者,它只是定义用户类型,还有指定对应的用户模型
[
'providers' => [
//表示users 用户 使用App\User::class模型作为用户模型
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
//当然还可以配置其他用户,比如admin 后台用户
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
]
]
2|0使用守卫(Guard)方法
2|1指定guard,获取当前会话用户信息
Auth::guard('web')->user()
2|2使用默认 guard,获取当前会话登录信息
Auth::user();
注:默认配置在 config/auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
]
如果是上面的配置,那auth::user() 就相当于 Auth::guard('web')->user();
3|0如何在路由中使用 权限认证?
3|11.首先要理解 laravel 中间件使用方法:
中间件默认在 app\Http\Kernel.php 中注册 有以下数组(规则):
注册在 $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 数组中的中间件是路由组,一次调用别名其中的中间件都会调用(打包调用)
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,
],
];
注册在 $routeMiddleware 数组可以单独使用,也可以配合middlewareGroups 一起使用
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,
];
3|2路由使用用户认证方法(使用默认的auth 中间件方法)
//通过auth中间件使用其中的 ”admin guard”验证中间件
Route::middleware('auth:admin')->get('/', function () {
return view('welcome');
});
说明:auth:admin
auth 中间件/其中的冒号代表传参,参数为 admin 就是在guard 中注册的 admin 如下:
[
'admin' => [
//表示使用admin中间件下 使用“session 驱动”
//用户为users --具体定义users模型 在provider中定义
'driver' => 'session',
'provider' => 'admin',
]
]
这个auth:admin代表:
我这个路由需要进行用户认证:认证是否为 admin 用户,根据admin 守卫(guard)的配置,将会调用session模块验证用户
4|0Laravel Authenticate认证流程
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 中间件时就会触发权限认证
之后的具体操作就有中间件来完成了,比如发现未登录就跳转到登录页
5|0实战:Laravel-Admin 调用查询接口,不允许未登录用户访问api
在 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();
});