Cara menggunakan rangka kerja Hyperf untuk pengesahan
Dalam aplikasi web moden, pengesahan pengguna ialah ciri yang sangat penting. Untuk melindungi maklumat sensitif dan memastikan keselamatan aplikasi, pengesahan memastikan bahawa hanya pengguna yang disahkan boleh mengakses sumber terhad.
Hyperf ialah rangka kerja PHP berprestasi tinggi berdasarkan Swoole, yang menyediakan banyak fungsi dan alatan moden dan cekap. Dalam rangka kerja Hyperf, kita boleh menggunakan pelbagai kaedah untuk melaksanakan pengesahan identiti Dua daripada kaedah yang biasa digunakan akan diperkenalkan di bawah.
JWT ialah standard terbuka (RFC 7519) yang mentakrifkan kaedah ringkas dan serba lengkap untuk menghantar maklumat dengan selamat antara pihak yang berkomunikasi. Dalam rangka kerja Hyperf, kita boleh menggunakan pustaka sambungan lcobucci/jwt
untuk mencapai penjanaan dan pengesahan JWT. 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
dalam fail composer.json: rrreee
Kemudian laksanakan perintahkemas kini komposer
untuk memasang dependensi . 🎜🎜Seterusnya, kita boleh mencipta kelas JwtAuthenticator
untuk menjana dan mengesahkan JWT: 🎜rrreee🎜Kemudian, kita perlu mendaftarkan kelas JwtAuthenticator
dalam bekas rangka kerja Hyperf: 🎜rrreee🎜Akhir sekali, dalam laluan atau kaedah pengawal yang memerlukan pengesahan, kita boleh menggunakan kelas JwtAuthenticator
untuk mengesahkan JWT pengguna: 🎜rrreeeconfig/autoload/session.php
, contohnya: 🎜rrreee🎜Kemudian, dalam kaedah laluan atau pengawal yang memerlukan pengesahan, kita boleh gunakan Kelas AuthManager
yang disediakan oleh rangka kerja Hyperf digunakan untuk mengesahkan Sesi pengguna: 🎜rrreee🎜Dalam kod di atas, antara muka AuthManagerInterface
menyediakan banyak kaedah untuk pengesahan dan operasi pengguna , yang boleh menjadi Buat panggilan berdasarkan keperluan sebenar. 🎜🎜Di atas ialah dua kaedah biasa untuk pengesahan identiti menggunakan rangka kerja Hyperf, menggunakan JWT atau Sesi untuk melaksanakan pengesahan pengguna. Berdasarkan keperluan sebenar dan ciri projek, pilih kaedah yang sesuai untuk memastikan keselamatan aplikasi dan pengalaman pengguna. Dalam pembangunan sebenar, anda boleh mengetahui lebih lanjut tentang penggunaan lanjutan dan amalan terbaik berdasarkan dokumentasi dan kod sampel yang disediakan oleh rangka kerja. 🎜Atas ialah kandungan terperinci Cara menggunakan rangka kerja Hyperf untuk pengesahan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!