Rumah  >  Artikel  >  rangka kerja php  >  Cara menggunakan rangka kerja Hyperf untuk pengesahan

Cara menggunakan rangka kerja Hyperf untuk pengesahan

PHPz
PHPzasal
2023-10-24 10:01:01598semak imbas

Cara menggunakan rangka kerja Hyperf untuk pengesahan

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.

  1. Menggunakan JWT (JSON Web Token)

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);
    }
}
  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

Mula-mula, kita perlu menambah kebergantungan pustaka lcobucci/jwt dalam fail composer.json:

rrreee

Kemudian laksanakan perintah kemas 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: 🎜rrreee
    🎜Gunakan Sesi🎜🎜🎜 Selain pengesahan JWT, rangka kerja Hyperf juga menyokong penggunaan Sesi untuk pengesahan identiti. Kami boleh mendayakan fungsi pengesahan Sesi melalui fail konfigurasi. 🎜🎜Pertama, kita perlu membuat konfigurasi yang sepadan dalam fail konfigurasi config/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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn