Heim >PHP-Framework >Swoole >So verwenden Sie das Hyperf-Framework zur Authentifizierung

So verwenden Sie das Hyperf-Framework zur Authentifizierung

PHPz
PHPzOriginal
2023-10-24 10:01:01748Durchsuche

So verwenden Sie das Hyperf-Framework zur Authentifizierung

So verwenden Sie das Hyperf-Framework zur Authentifizierung

In modernen Webanwendungen ist die Benutzerauthentifizierung eine sehr wichtige Funktion. Um vertrauliche Informationen zu schützen und die Anwendungssicherheit zu gewährleisten, stellt die Authentifizierung sicher, dass nur authentifizierte Benutzer auf eingeschränkte Ressourcen zugreifen können.

Hyperf ist ein leistungsstarkes PHP-Framework auf Basis von Swoole, das viele moderne und effiziente Funktionen und Tools bereitstellt. Im Hyperf-Framework können wir mehrere Methoden zur Implementierung der Identitätsauthentifizierung verwenden. Im Folgenden werden zwei der häufig verwendeten Methoden vorgestellt.

  1. Verwendung von JWT (JSON Web Token)

JWT ist ein offener Standard (RFC 7519), der eine prägnante, eigenständige Methode zur sicheren Übertragung von Informationen zwischen kommunizierenden Parteien definiert. Im Hyperf-Framework können wir die Erweiterungsbibliothek lcobucci/jwt verwenden, um die JWT-Generierung und -Verifizierung zu erreichen. lcobucci/jwt扩展库来实现JWT的生成和验证。

首先,我们需要在composer.json文件中添加lcobucci/jwt库的依赖项:

"require": {
    "lcobucci/jwt": "^3.4"
}

然后执行composer update命令安装依赖项。

接下来,我们可以创建一个JwtAuthenticator类,用于生成和验证JWT:

<?php

declare(strict_types=1);

namespace AppAuth;

use HyperfExtAuthAuthenticatable;
use HyperfExtAuthContractsAuthenticatorInterface;
use LcobucciJWTConfiguration;
use LcobucciJWTToken;

class JwtAuthenticator implements AuthenticatorInterface
{
    private Configuration $configuration;

    public function __construct(Configuration $configuration)
    {
        $this->configuration = $configuration;
    }

    public function validateToken(string $token): bool
    {
        $parsedToken = $this->configuration->parser()->parse($token);
        $isVerified = $this->configuration->validator()->validate($parsedToken, ...$this->configuration->validationConstraints());
        
        return $isVerified;
    }

    public function generateToken(Authenticatable $user): string
    {
        $builder = $this->configuration->createBuilder();
        $builder->issuedBy('your_issuer')
            ->issuedAt(new DateTimeImmutable())
            ->expiresAt((new DateTimeImmutable())->modify('+1 hour'))
            ->withClaim('sub', (string) $user->getAuthIdentifier());
        
        $token = $builder->getToken($this->configuration->signer(), $this->configuration->signingKey());
        
        return $token->toString();
    }
}

然后,我们需要在Hyperf框架的容器中注册JwtAuthenticator类:

HyperfUtilsApplicationContext::getContainer()->define(AppAuthJwtAuthenticator::class, function (PsrContainerContainerInterface $container) {
    $configuration = LcobucciJWTConfiguration::forAsymmetricSigner(
        new LcobucciJWTSignerRsaSha256(),
        LcobucciJWTSignerKeyLocalFileReference::file('path/to/private/key.pem')
    );

    return new AppAuthJwtAuthenticator($configuration);
});

最后,在需要认证的路由或控制器方法中,我们可以使用JwtAuthenticator类来验证用户的JWT:

<?php

declare(strict_types=1);

namespace AppController;

use AppAuthJwtAuthenticator;
use HyperfHttpServerAnnotationController;
use HyperfHttpServerAnnotationRequestMapping;

/**
 * @Controller(prefix="/api")
 */
class ApiController
{
    private JwtAuthenticator $authenticator;

    public function __construct(JwtAuthenticator $authenticator)
    {
        $this->authenticator = $authenticator;
    }

    /**
     * @RequestMapping(path="profile", methods="GET")
     */
    public function profile()
    {
        $token = $this->request->getHeader('Authorization')[0] ?? '';
        $token = str_replace('Bearer ', '', $token);
        
        if (!$this->authenticator->validateToken($token)) {
            // Token验证失败,返回错误响应
            return 'Unauthorized';
        }

        // Token验证成功,返回用户信息
        return $this->authenticator->getUserByToken($token);
    }
}
  1. 使用Session

除了JWT认证,Hyperf框架也支持使用Session进行身份认证。我们可以通过配置文件来启用Session认证功能。

首先,我们需要在配置文件config/autoload/session.php中进行相应的配置,例如:

return [
    'handler' => [
        'class' => HyperfRedisSessionHandler::class,
        'options' => [
            'pool' => 'default',
        ],
    ],
];

然后,在需要认证的路由或控制器方法中,我们可以使用Hyperf框架提供的AuthManager类来验证用户的Session:

<?php

declare(strict_types=1);

namespace AppController;

use HyperfHttpServerAnnotationController;
use HyperfHttpServerAnnotationRequestMapping;
use HyperfExtAuthContractsAuthManagerInterface;

/**
 * @Controller(prefix="/api")
 */
class ApiController
{
    private AuthManagerInterface $authManager;

    public function __construct(AuthManagerInterface $authManager)
    {
        $this->authManager = $authManager;
    }

    /**
     * @RequestMapping(path="profile", methods="GET")
     */
    public function profile()
    {
        if (!$this->authManager->check()) {
            // 用户未登录,返回错误响应
            return 'Unauthorized';
        }

        // 用户已登录,返回用户信息
        return $this->authManager->user();
    }
}

在上述代码中,AuthManagerInterface

Zuerst müssen wir die Abhängigkeiten der lcobucci/jwt-Bibliothek in der Datei „composer.json“ hinzufügen:

rrreee

Dann führen Sie den Befehl composer update aus, um die Abhängigkeiten zu installieren . 🎜🎜Als nächstes können wir eine JwtAuthenticator-Klasse zum Generieren und Validieren von JWT erstellen: 🎜rrreee🎜Dann müssen wir die JwtAuthenticator-Klasse im Container des Hyperf-Frameworks registrieren: 🎜rrreee🎜Schließlich können wir in einer Route oder Controller-Methode, die eine Authentifizierung erfordert, die Klasse JwtAuthenticator verwenden, um das JWT des Benutzers zu überprüfen: 🎜rrreee
    🎜Use Session🎜🎜🎜 Zusätzlich zur JWT-Authentifizierung unterstützt das Hyperf-Framework auch die Verwendung von Session zur Identitätsauthentifizierung. Wir können die Sitzungsauthentifizierungsfunktion über die Konfigurationsdatei aktivieren. 🎜🎜Zuerst müssen wir die entsprechende Konfiguration in der Konfigurationsdatei config/autoload/session.php vornehmen, zum Beispiel: 🎜rrreee🎜Dann können wir dies in der Route oder Controller-Methode tun, die eine Authentifizierung erfordert Verwenden Sie die vom Hyperf-Framework bereitgestellte Klasse AuthManager, um die Sitzung des Benutzers zu überprüfen: 🎜rrreee🎜Im obigen Code stellt die Schnittstelle AuthManagerInterface viele Methoden für die Authentifizierung und Benutzeroperationen bereit , mit dem Anrufe je nach tatsächlichem Bedarf getätigt werden können. 🎜🎜Die oben genannten sind zwei gängige Methoden zur Identitätsauthentifizierung mithilfe des Hyperf-Frameworks, wobei JWT oder Session zur Implementierung der Benutzerauthentifizierung verwendet werden. Wählen Sie basierend auf den tatsächlichen Anforderungen und Projektmerkmalen geeignete Methoden aus, um Anwendungssicherheit und Benutzererfahrung zu gewährleisten. In der tatsächlichen Entwicklung können Sie anhand der vom Framework bereitgestellten Dokumentation und des Beispielcodes mehr über die erweiterte Verwendung und Best Practices erfahren. 🎜

Das obige ist der detaillierte Inhalt vonSo verwenden Sie das Hyperf-Framework zur Authentifizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn