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.
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); } }
除了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
lcobucci/jwt
-Bibliothek in der Datei „composer.json“ hinzufügen: rrreee
Dann führen Sie den Befehlcomposer 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: 🎜rrreeeconfig/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!