Espero que todos possam encontrar a postura de operação correta e não copiá-la diretamente da Internet. Na verdade, existem alguns métodos incorporados à estrutura.
Configurar middleware
classe de middleware
Primeiro vá ao Laravel para obter o código-fonte do middleware: ThrottleRequests.php , e então app/Http/Middleware
crie este arquivo dentro (você pode criar subpastas como quiser).
Aqui eu coloco o middleware no app/Http/Middleware/Route
diretório.
Observe que para ser compatível com PHP 8 , eu uso um tipo de dados forte aqui, apenas modifique este método de acordo com o ambiente real.
<?php
namespace App\Http\Middleware\Route;
// 省略 use 部分
class ThrottleRequests {
// 省略前文
/**
* Resolve request signature.
*
* @param Request $request
*
* @return string
*
* @throws RuntimeException
*/
protected function resolveRequestSignature(Request $request): string {
// 此处加入该注释是为了让 IDE 识别 $user 变量的具体类型
/** @var Authenticatable|null $user */
if ($user = $request->user()) {
// 这里在 PHPStorm/IDEA 中按住 Ctrl 后鼠标左键是可以点击进 getAuthIdentifier 方法的
// 这是已登录(通过验证)状态下的唯一指纹
return sha1($user->getAuthIdentifier());
}
// 未登录时 fingerprint 方法已实现了一套生成唯一指纹操作
return $request->fingerprint();
}
}
Não fique online para copiar este código para substituir este método:
return sha1(
$request->method() .
'|' . $request->server('SERVER_NAME') .
'|' . $request->path() .
'|' . $request->ip()
);
middleware de aplicativo
Abra bootstrap/app.php
o arquivo e aplique as seguintes configurações na seção de middleware:
$app->routeMiddleware([
// 中间件命名可任意变更
'auth' => App\Http\Middleware\Route\Authenticate::class, // 对应自己的登录验证中间件
'throttle' => App\Http\Middleware\Route\ThrottleRequests::class,
]);
Abra routes/web.php
Aplicar middleware às rotas:
$router->group([
'namespace' => 'Home',
'middleware' => [
'throttle:60,1' // 次数,分钟(此为 60 次请求每分钟)
]
], function (Router $router) {
$router->get('home/index', 'HomeController@index');
});
Corrija os erros que ocorrerão
ilustrar
Depois que as operações acima forem executadas, uma exceção será lançada quando o usuário estiver logado ( auth
verificado pelo middleware), porque a impressão digital única do status de login é baseada na do usuário id
, ou seja primaryKey
, .
Vamos dar uma olhada no processo de verificação de tokens de usuário no Lumen :
- O token do usuário é inserido primeiro
App\Providers\AuthServiceProvider
e a verificação básica é realizada por meio do métodoboot
no contêiner da estrutura no método ;viaRequest
viaRequest
O método deve retornar a instância do usuário ounull
, ou seja, quando a verificação for bem-sucedida, deve retornar umIlluminate\Database\Eloquent\Model
objeto herdado de ;- A solicitação fluirá para cada middleware, por exemplo,
auth
alguns julgamentos podem ser feitos no middleware para responder de forma diferente (expiração de token, etc.).
Por que você diz que haverá um erro? Anteriormente, $user
definimos uma anotação de tipo de dados para a variável Authenticatable
, o middleware limitador atual precisa obtê-lo primaryKey
e, em seguida, obter o valor da chave primária específica na instância.
concluir
Na verdade, o app/User.php
modelo de usuário padrão da estrutura já deu um exemplo. Se for excluído, consulte as seguintes operações para implementá-lo.
Assumindo que nosso modelo de usuário UserModel
foi criado (independentemente do local), nem é preciso dizer que a classe deve herdar dele Illuminate\Database\Eloquent\Model
. Claro, isso não afetará se você implementar uma Model
classe abstrata no meio.
Primeiro importe estes:
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Laravel\Lumen\Auth\Authorizable;
Em seguida, deixe a classe de modelo do usuário implementar os dois apresentados acima Contract
:
class UserModel extends Model implements AuthenticatableContract, AuthorizableContract {
}
Neste momento, o IDE já reportou um erro com uma linha vermelha. Não se preocupe, continue introduzindo 3 na classe trait
:
class UserModel extends Model implements AuthenticatableContract, AuthorizableContract {
use Authenticatable, Authorizable, HasFactory;
}
Deve-se observar aqui que, se a chave primária não for id
mas user_id
, você precisará especificar variáveis de membro nesta classeprotected $primaryKey = 'user_id';
Mesclar o código:
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Laravel\Lumen\Auth\Authorizable;
class UserModel extends Model implements AuthenticatableContract, AuthorizableContract {
use Authenticatable, Authorizable, HasFactory;
protected $table = 'user';
protected $primaryKey = 'user_id';
}
Até agora, um middleware completo de limitação de taxa de roteamento compatível com a estrutura Lumen foi concluído.