Laravel问题集锦

目录
  1. 1. 配置默认队列驱动为Redis
  2. 2. 通过API的方式进行用户注册和用户认证

配置默认队列驱动为Redis

队列配置文件是config/queue.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
return [

'default' => env('QUEUE_DRIVER', 'sync'),

'connections' => [
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'expire' => 60,
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'expire' => 60,
],
],

'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
];

配置文件第一个配置项default用于指定默认的队列驱动,修改.env中的QUEUE_DRIVER即可。

通过API的方式进行用户注册和用户认证

Laravel中花了很大的篇幅讲用户认证,但是这种认证方式是基于MVC方式注册登录的用户,而我现在的项目都是完全的前后端分离,前端使用VUE框架,通过axios进行数据交互,laravel只作为后端接口使用,所以自带的用户认证的方式并不适用这一场景。不过在最新的laravel7中给出了最佳方案————Sanctum 轻量级 API 认证,使用起来也特别简单:

1
2
3
4
5
6
7
8
$user = User::create([
'name' => 'rex',
'email' => 'a@a.cn',
'password' => bcrypt('123789'),
]);
//主要是下面这一行,创建了token并存到了personal_access_tokens表中
$token = $user->createToken('用户名等唯一字段');
return $token->plainTextToken;

客户端会在响应里接收到$token->plainTextToken返回的结果,把这个结果放在以后每次请求的header中:header[authorization] = "Bearer 080042cad6356ad5dc0a720c18b53b8e53d4c274"

下次请求的时候,只要这样既可获取到用户的信息:

1
2
3
Route::middleware('auth:sanctum')->get('/get_user', function (Request $request) {
return $request->user();
});

获取到的结果:

1
2
3
4
5
6
7
8
{
"id": 1,
"name": "rex",
"email": "a@a.cn",
"email_verified_at": null,
"created_at": "2020-08-25T07:42:16.000000Z",
"updated_at": "2020-08-25T07:42:16.000000Z"
}

Sanctum生成的token是固定的,在个别项目中,可能为了反爬需要,前端的token是可变的,比如前端authorization = md5(后端计算出的token+'abc'+随机数),然后把authorization、token和随机数一起在header中发送到后端进行验证,这种需求使用Sanctum好像无法直接实现。不过可以变通一下,header[authorization2] = md5(后端计算出的token+'abc'+随机数),然后在后端路由中自定义一个中间件进行验证。

对于多用户认证,比如系统里还有管理员用户,需要先创建admins表。
然后新增管理员:

1
2
3
4
5
6
7
8
$admin = Admin::create([ //注意此处是Admin::create
'name' => 'addmin',
'email' => 'addmin@ad.cn',
'password' => bcrypt('1237890'),
]);
// 创建的token仍然是存储在personal_access_tokens表中,不过tokenable_type字段的值是App\Admin,原来user表对应的是App\User
$token = $admin->createToken('addmin');
return $token->plainTextToken;

获取管理员信息的代码不变:

1
2
3
Route::middleware('auth:sanctum')->get('/get_admin', function (Request $request) {
return $request->user();
});