blastanders/myth-auth

适用于CodeIgniter 4的灵活认证/授权系统。增加了使用认证应用程序支持双因素认证。

1.0.5 2024-09-04 01:51 UTC

This package is auto-updated.

Last update: 2024-09-13 01:01:19 UTC


README

Coverage Status

适用于CodeIgniter 4的灵活、强大、安全的认证包。

现在支持使用认证应用程序进行双因素认证。

项目通知

截至 2022年6月,CodeIgniter现在有一个官方的认证库,CodeIgniter Shield。如果您正在寻找用于新项目的认证解决方案,那么这是推荐的解决方案。

现在该项目由志愿者维护。如果您与项目仓库互动,可能会在收到回复时出现延迟。请将支持问题直接发送至 GitHub Discussions 或 CodeIgniter 的 论坛Slack频道

要求

  • PHP 7.4+, 8.0+
  • CodeIgniter 4.1+

特性

这是一个一站式商店,可以满足您99%的基于CI4的Web认证需求。它包括以下主要功能

  • 基于密码的认证,具有Web应用程序的记住我功能
  • 符合NIST标准的扁平RBAC,详情请见此处此处
  • 登录、注册和忘记密码流程所需的所有视图。
  • 通过CLI命令发布文件到主应用程序,以便轻松自定义
  • 调试工具栏集成
  • 基于电子邮件的账户验证

安装

最好通过Composer进行安装。假设Composer已全局安装,您可以使用以下命令

    > composer require blastanders/myth-auth

这将把最新稳定版本的 Myth:Auth 添加为您的项目模块。

手动安装

如果您选择不使用Composer进行安装,您可以克隆或下载此存储库,然后通过编辑 app/Config/Autoload.php 并将 Myth\Auth 命名空间添加到 $psr4 数组中启用它。例如,如果您将其复制到 app/ThirdParty/

    $psr4 = [
        'Config'      => APPPATH . 'Config',
        APP_NAMESPACE => APPPATH,
        'App'         => APPPATH,
        'Myth\Auth'   => APPPATH . 'ThirdParty/myth-auth/src',
    ];

升级

请务必查看 变更文档 以获取升级版本后需要采取的必要步骤。

    > composer update blastanders/myth-auth

视图:请务必将模块配置下 src/Config/Auth.php 中的 $views 复制一份

配置

安装完成后,您需要配置框架以使用 Myth\Auth 库。在您的应用程序中执行以下设置

  1. 编辑 app/Config/Email.php 并确认已设置 fromNamefromEmail,因为它们用于发送密码重置等电子邮件。

  2. 编辑 app/Config/Validation.php 并将以下值添加到 ruleSets 数组中: \Myth\Auth\Authentication\Passwords\ValidationRules::class

  3. 确保您的数据库设置正确,然后运行Auth迁移

    > php spark migrate -all  

注意:此库使用您应用的缓存设置来减少数据库查询。如果您想使用此功能,只需确保您使用的是除 dummy 之外的缓存引擎,并且已正确设置。GroupModelPermissionModel 将在后台为您处理缓存和失效。

概述

首次安装时,Myth:Auth 已设置为提供所有基本身份验证服务,包括新用户注册、登录/注销和忘记密码流程。

“记住我”功能默认关闭,但您可以通过将 Config/Auth.php 中的 $allowRemembering 变量设置为 true 来启用它。

路由

路由定义在 Auth 的 Config/Routes.php 文件中。当 CodeIgniter 处理路由时,会自动定位此文件。如果您想自定义路由,应将文件复制到 app/Config 目录,更新命名空间,并在那里进行路由更改。您还可以使用 Config\Auth$reservedRoutes 属性来重定向内部路由名称。

视图

提供了基于 Bootstrap 4 的基本视图,适用于所有功能。

您可以通过编辑 Config/Auth.php 来覆盖使用的视图,并更改 $views 变量中的适当值。

public $views = [
    'login'       => 'Myth\Auth\Views\login',
    'register'    => 'Myth\Auth\Views\register',
    'forgot'      => 'Myth\Auth\Views\forgot',
    'reset'       => 'Myth\Auth\Views\reset',
    'emailForgot' => 'Myth\Auth\Views\emails\forgot',
];

注意:如果您不熟悉 CodeIgniter 中视图的命名空间,请参阅 CodeIgniter 用户指南 中有关代码模块支持的章节。

服务

此软件包提供以下服务

身份验证

提供对 Myth:Auth 知道的任何身份验证包的访问。默认情况下,它将返回“本地身份验证”库,这是一个基于密码的基本系统。

    $authenticate = service('authentication');

您可以通过指定第一个参数来指定要使用的库

    $authenticate = service('authentication', 'jwt');

授权

提供对 Myth:Auth 知道的任何授权库的访问。默认情况下,它将返回“Flat”授权库,这是由 NIST 定义的平面 RBAC(基于角色的访问控制)。它提供用户特定的权限以及基于组(角色)的权限。

    $authorize = service('authorization');

密码

提供直接访问密码验证系统。这是一个可扩展的系统,目前支持许多 NIST 的最新数字身份指南。验证器附带一个包含超过 620,000 个常见/泄露密码的词典,可用于检查。自动检查用户电子邮件/用户名的几种变体。

    $authenticate = service('passwords');

通常您不需要直接访问此库,因为提供了一个新的验证规则,可以与验证库一起使用,strong_password。为了启用此功能,您必须首先编辑 app/Config/Validation.php 并将新规则集添加到可用的规则集中

     public $ruleSets = [
        \CodeIgniter\Validation\Rules::class,
        \CodeIgniter\Validation\FormatRules::class,
        \CodeIgniter\Validation\FileRules::class,
        \CodeIgniter\Validation\CreditCardRules::class,
        \Myth\Auth\Authentication\Passwords\ValidationRules::class,
    ];

现在您可以在任何验证规则集中使用 strong_password

    $validation->setRules([
        'username' => 'required',
        'password' => 'required|strong_password'
    ]);

辅助函数

Myth:Auth 提供了自己的 辅助,包括以下辅助函数,以简化对基本功能的访问。在使用这些函数之前,请确保已加载辅助程序: helper('auth');

提示:将 'auth' 添加到任何控制器的 $helper 属性,以自动加载它,或者在 app/Controllers/BaseController.php 中添加相同的代码,以使其全局可用。auth 过滤器会预先加载辅助程序,因此它可在任何过滤路由上使用。

logged_in()

  • 函数:检查是否有用户已登录。
  • 参数:无
  • 返回:truefalse

user()

  • 功能:返回当前登录用户的User实例。
  • 参数:无
  • 返回:当前用户实体,或 null

user_id()

  • 功能:返回当前登录用户的用户ID。
  • 参数:无
  • 返回:当前用户的整数ID,或 null

in_groups()

  • 功能:确保当前用户在传递的组中至少有一个。
  • 参数:组ID或名称,可以是单个项或项数组。
  • 返回:truefalse

has_permission()

  • 功能:确保当前用户至少有一个传递的权限。
  • 参数:权限ID或名称。
  • 返回:truefalse

用户

Myth:Auth使用CodeIgniter实体作为其User对象,并且您的应用程序也必须使用该类。此类提供自动密码散列以及禁止/解除禁止、密码重置哈希生成等实用方法。

它还提供了一个UserModel,应使用它,因为它提供了密码重置流程期间所需的方法,以及基本的验证规则。您可以根据需要扩展此类或修改它。

UserModel可以在用户创建时自动分配角色。在调用insert()save()之前,将组名传递给withGroup()方法以创建新用户,并将用户自动添加到该组。

    $user = $userModel
                ->withGroup('guests')
                ->insert($data);

用户注册已为您处理此操作,并查找Auth配置文件中的$defaultUserGroup设置,以查找要添加用户的组名称。请注意,$defaultUserGroup变量默认未设置。

工具栏

Myth:Auth包含一个工具栏收集器,以使开发人员更容易使用和调试身份验证过程。要启用收集器,编辑app/Config/Toolbar.php并将其添加到活动收集器列表中

	public $collectors = [
		\CodeIgniter\Debug\Toolbar\Collectors\Timers::class,
		\CodeIgniter\Debug\Toolbar\Collectors\Database::class,
        ...
		\Myth\Auth\Collectors\Auth::class,
	];

按路由限制

如果您在app/Config/Routes.php文件中指定了每个路由,您可以使用控制器过滤器按组/角色或权限限制对用户的访问。

首先,编辑application/Config/Filters.php并将以下条目添加到aliases属性中

    'login'      => \Myth\Auth\Filters\LoginFilter::class,
    'role'       => \Myth\Auth\Filters\RoleFilter::class,
    'permission' => \Myth\Auth\Filters\PermissionFilter::class,

全局限制

角色和权限过滤器需要额外的参数,但LoginFilter可以用来限制网站的一部分(或整个网站)对任何已认证用户。如果没有检测到已登录用户,则过滤器将重定向用户到登录表单。

通过编辑app/Config/Filters.php并根据需要将其添加到$filters数组中,根据它们的URI模式限制路由,例如。

public filters = [
    'login' => ['before' => ['account/*']],
];

或将LoginFilter添加到$globals数组中,以限制整个网站

    public $globals = [
        'before' => [
            'honeypot',
            'login',
    ...

限制单个路由

任何单个路由都可以通过将filter选项添加到任何路由定义方法的最后一个参数来限制

$routes->get('admin/users', 'UserController::index', ['filter' => 'permission:manage-user'])
$routes->get('admin/users', 'UserController::index', ['filter' => 'role:admin,superadmin'])

过滤器可以是rolepermission,这会根据组或权限来限制路由。您必须添加一个以逗号分隔的组或权限列表,以检查已登录用户。

限制路由组

同样,可以在group()方法中限制整个路由组

$routes->group('admin', ['filter' => 'role:admin,superadmin'], function($routes) {
    ...
});

自定义

请参阅扩展文档。