ddruganov/yii2-api-auth

该软件包最新版本(1.4.0)没有可用的许可证信息。

yii2 的身份验证工具

安装: 42

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.4.0 2022-04-26 07:21 UTC

README

带有 rbac 的 JWT 身份验证服务器

安装

composer require ddruganov/yii2-api-auth

如何使用

  1. 将此添加到您的应用程序主配置中
...
    'components' => [
        AuthComponentInterface::class => AuthComponent::class,
        RbacComponentInterface::class => RbacComponent::class,
        AccessTokenProviderInterface::class => HeaderAccessTokenProvider::class
    ],
    'controllerMap' => [
        'auth' => AuthController::class,
        'app' => AppController::class,
        'permission' => PermissionController::class,
        'role' => PermissionController::class,
        'user' => PermissionController::class
    ],
...
  1. 将此添加到您的应用程序参数中
...
    'authentication' => [
        'masterPassword' => [
            'enabled' => false,
            'value' => ''
        ],
        'tokens' => [
            'secret' => '',
            'access' => [
                'ttl' => 0, // seconds
                'issuer' => ''
            ],
            'refresh' => [
                'ttl' => 0 // seconds
            ]
        ],
        'maxActiveSessions' => 3
    ]
...
  1. 在您的控制台配置中添加迁移以启用 rbac 功能
...
    'controllerMap' => [
        'migrate' => [
            'class' => MigrateController::class,
            'migrationPath' => null,
            'migrationNamespaces' => [
                'console\migrations',
                'ddruganov\Yii2ApiAuth\migrations',
            ],
        ],
    ],
...

身份验证

所有方法都需要 authenticate 权限;

  • POST auth/login 使用电子邮件和密码登录到默认应用程序并获取一对令牌
  • POST auth/login-into 使用应用程序 ID 当已认证时在其他应用程序中进行认证
  • POST auth/refresh 使用您的刷新令牌以获取新鲜的一对令牌
  • POST auth/logout 登出
  • GET auth/current-user 获取当前用户信息
  • GET auth/verify 保留;由 ddruganov\yii2-api-auth-proxy 使用
  • POST auth/check-permission 保留;由 ddruganov\yii2-api-auth-proxy 使用
  • 使用 Yii::$app->get(AuthComponentInterface::class)->getCurrentUser() 获取当前登录的 ddruganov\Yii2ApiEssentials\auth\models\User
  • AuthFilter 作为行为附加到您的 ApiController 以仅允许已认证用户访问端点
  • RbacFilter 作为行为附加到您的 ApiController 以仅允许具有特定权限的用户访问端点

显然,您的 User 类将不仅仅有简单的字段如 emailname,因此您必须从 AuthComponent 返回不同的用户类型。最简单的方法是

final class YourAuthComponent extends Yii2ApiAuthComponent
{
    public function getCurrentUser(): ?YourUser
    {
        return YourUser::findOne($this->getPayloadValue('uid'));
    }
}

YourUser 必须扩展 ddruganov\Yii2ApiEssentials\auth\models\User

应用程序

  • GET app/all 获取所有可用应用程序的列表
  • GET app/one 使用应用程序 UUID 获取单个应用程序的信息
  • POST app/create 创建应用程序;需要 app.create 权限
  • POST app/update 更新应用程序;需要 app.update 权限
  • POST app/delete 删除应用程序;需要 app.delete 权限
  • 使用 Yii::$app->get(AuthComponentInterface::class)->login($user, $app) 获取指定应用程序的一对令牌
  • 别忘了为新创建的应用程序创建权限

请注意,您不能创建默认应用程序,只能更改现有应用程序以适应您的数据

权限

  • GET permission/all 获取所有可用权限的列表;需要 permission.view 权限
  • GET permission/one 使用权限 ID 获取关于权限的完整信息;需要 permission.view 权限
  • POST permission/create 创建权限;需要 permission.create 权限
  • POST permission/update 更新权限;需要 permission.update 权限
  • POST permission/delete 删除权限(同时删除角色绑定);需要 permission.delete 权限

角色

  • GET role/all 获取所有可用角色的列表;需要 role.view 权限
  • GET role/one 使用角色 ID 获取关于角色的完整信息;需要 role.view 权限
  • POST role/create 创建角色;需要 role.create 权限
  • POST role/update 更新角色;需要 role.update 权限
  • POST role/delete 删除角色(同时删除权限和用户绑定);需要 role.delete 权限

用户

  • GET user/all 获取所有可用用户列表;需要 user.view 权限
  • GET user/one 带用户 ID 获取用户完整信息;需要 user.view 权限
  • POST user/create 创建用户;需要 user.create 权限
  • POST user/update 更新用户;需要 user.update 权限
  • POST user/delete 删除用户(同时删除角色绑定);需要 user.delete 权限

扩展用户控制器、表单和收集器的示例

final class YourUpdateForm extends UpdateForm {
    public ?bool $isBanned = false;

    public function rules() {
        return ArrayHelper::merge(parent::rules(), [
            [['isBanned'], 'required']
        ]);
    }

    protected function setCustomAttributes(Model $model) {
        parent::setCustomAttributes($model);
        $model->setAttributes([
            'is_banned' => $this->isBanned
        ]);
    }
}
final class YourUserAllCollector extends UserAllCollector {
    protected function _run(): ExecutionResult {
        $query = YourUser::find()
            ->newestFirst()
            ->limit($this->limit)
            ->page($this->page);

        return ExecutionResult::success([
            'totalPageCount' => (clone $query)->getPageCount(),
            'users' => array_map(
                fn (User $user) => [
                    'id' => $user->getId(),
                    'email' => $user->getEmail(),
                    'name' => $user->getName(),
                    'isBanned' => $user->isBanned(),
                    'createdAt' => $user->getCreatedAt(),
                ],
                (clone $query)->all()
            )
        ]);
    }
}
final class YourUserController extends UserController {
    public function actions() {
        return ArrayHelper::merge(parent::actions(),[
            'all' => YourAllUserCollector::class,
            'update' => YourUpdateForm::class
        ]);
    }
}

YourUser 必须扩展 ddruganov\Yii2ApiEssentials\auth\models\User