Postura correta do Lumen 9.x para limite de corrente de roteamento [Não copie o código aleatoriamente]

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/Middlewarecrie este arquivo dentro (você pode criar subpastas como quiser).

Aqui eu coloco o middleware no app/Http/Middleware/Routediretó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.phpo 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.phpAplicar 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 ( authverificado 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 :

  1. O token do usuário é inserido primeiro App\Providers\AuthServiceProvidere a verificação básica é realizada por meio do método bootno contêiner da estrutura no método ;viaRequest
  2. viaRequestO método deve retornar a instância do usuário ou null, ou seja, quando a verificação for bem-sucedida, deve retornar um Illuminate\Database\Eloquent\Modelobjeto herdado de ;
  3. A solicitação fluirá para cada middleware, por exemplo, authalguns 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, $userdefinimos uma anotação de tipo de dados para a variável Authenticatable, o middleware limitador atual precisa obtê-lo primaryKeye, em seguida, obter o valor da chave primária específica na instância.

concluir

Na verdade, o app/User.phpmodelo 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 UserModelfoi 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 Modelclasse 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 idmas 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.

Acho que você gosta

Origin blog.csdn.net/maxsky/article/details/123563921
Recomendado
Clasificación