nasustop/hapi-auth
Composer 安装命令:
composer require nasustop/hapi-auth
包简介
README 文档
README
hapi的auth组件
安装
composer require nasustop/hapi-auth
声称配置文件
php bin/hyperf.php vendor:publish nasustop/hapi-auth
示例
<?php
declare(strict_types=1);
/**
* This file is part of Hapi.
*
* @link https://www.nasus.top
* @document https://wiki.nasus.top
* @contact xupengfei@xupengfei.net
* @license https://github.com/nasustop/hapi/blob/master/LICENSE
*/
namespace SystemBundle\Auth;
use Hyperf\HttpMessage\Exception\BadRequestHttpException;
use Hyperf\HttpMessage\Exception\UnauthorizedHttpException;
use Hyperf\Snowflake\IdGeneratorInterface;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use Nasustop\HapiAuth\UserProvider;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\SimpleCache\InvalidArgumentException;
use SystemBundle\Service\SystemUserService;
class AuthUserProvider extends UserProvider
{
public function getInfo(array $payload): array
{
if (empty($payload['id'])) {
throw new UnauthorizedHttpException('登录失效,请重新登录');
}
$user = cache($this->getCacheDriver())->get((string) $payload['id']);
if (empty($user)) {
throw new UnauthorizedHttpException('登录失效,请重新登录');
}
$user['id'] = $payload['id'];
return $user;
}
/**
* @throws NotFoundExceptionInterface
* @throws ContainerExceptionInterface
* @throws InvalidArgumentException
*/
public function login(array $inputData): array
{
$validatorFactory = $this->container->get(ValidatorFactoryInterface::class);
$validator = $validatorFactory->make($inputData, [
'username' => 'required',
'password' => 'required',
], [
'username.*' => '请填写登录账号',
'password.*' => '请填写密码',
]);
if ($validator->fails()) {
throw new BadRequestHttpException($validator->errors()->first());
}
$service = $this->container->get(SystemUserService::class);
$userInfo = $service->getRepository()->getInfo([
[
['login_name' => $inputData['username']],
'or',
['mobile' => $inputData['username']],
],
]);
if (empty($userInfo)) {
throw new BadRequestHttpException('账号不存在');
}
// 验证密码
if (! $service->getRepository()->validatePassword($inputData['password'], $userInfo['password'])) {
throw new BadRequestHttpException('密码错误');
}
unset($userInfo['password']);
// 验证状态
$service->getRepository()->validateUserStatus(user_status: $userInfo['user_status']);
// support admin user
$support_admin_user = config(sprintf('auth.%s.support_admin_user', $this->guard), '');
$support_admin_user = explode(',', $support_admin_user);
$userInfo['is_support_user'] = ! empty($userInfo['user_id']) && in_array($userInfo['user_id'], $support_admin_user);
$cacheUserIdKey = $this->getCacheUserIdKey(user_id: $userInfo['user_id']);
$cacheSnowflakeId = cache($this->getCacheDriver())->get(key: $cacheUserIdKey);
if (empty($cacheSnowflakeId)) {
// generate snowflake id
$generator = $this->container->get(id: IdGeneratorInterface::class);
$cacheSnowflakeId = $generator->generate();
}
$exp = (int) config(sprintf('auth.%s.jwt.exp', $this->guard), 7200);
cache($this->getCacheDriver())->set(key: (string) $cacheSnowflakeId, value: $userInfo, ttl: $exp);
cache($this->getCacheDriver())->set(key: $cacheUserIdKey, value: $cacheSnowflakeId, ttl: $exp);
return ['id' => $cacheSnowflakeId];
}
/**
* @throws InvalidArgumentException
*/
public function logout(array $payload): bool
{
if (! empty($payload['id'])) {
$userInfo = cache($this->getCacheDriver())->get(key: (string) $payload['id']);
if (! empty($userInfo['user_id'])) {
$cacheUserIdKey = $this->getCacheUserIdKey(user_id: $userInfo['user_id']);
cache($this->getCacheDriver())->delete(key: $cacheUserIdKey);
}
cache($this->getCacheDriver())->delete(key: (string) $payload['id']);
}
return true;
}
public function validateToken(array $payload): array
{
if (empty($payload['id'])) {
return [];
}
$user = cache($this->getCacheDriver())->get(key: (string) $payload['id']);
if (empty($user)) {
return [];
}
$user['id'] = $payload['id'];
return $user;
}
protected function getCacheDriver()
{
return config(sprintf('auth.%s.cache', $this->guard), 'default');
}
protected function getCacheUserIdKey(int $user_id): string
{
return sprintf('auth:user_id:%s', $user_id);
}
}
nasustop/hapi-auth 适用场景与选型建议
nasustop/hapi-auth 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 04 月 03 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「php」 「hyperf」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 nasustop/hapi-auth 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 nasustop/hapi-auth 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 nasustop/hapi-auth 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
统计信息
- 总下载量: 10
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 11
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-04-03