myth/auth

适用于CodeIgniter 4的灵活认证/授权系统。

v1.2.1 2022-07-13 18:35 UTC

This package is auto-updated.

Last update: 2024-09-09 20:31:21 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 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',
    ];

升级

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

配置

安装完成后,您需要配置框架以使用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之外的其他缓存引擎,并且它已正确设置。GroupModel和PermissionModel将在后台为您处理缓存和失效。

概述

首次安装时,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 所知任意的认证包的访问。默认情况下,它将返回 "Local Authentication" 库,这是一个基于密码的基本系统。

    $authenticate = service('authentication');

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

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

授权

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

    $authorize = service('authorization');

密码

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

    $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 实例。
  • 参数:无
  • 返回:当前 User 实体或 null

user_id()

  • 函数:返回当前登录用户的 User ID。
  • 参数:无
  • 返回:当前 User 的整数 ID 或 null

in_groups()

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

has_permission()

  • 功能:确保当前用户具有传入权限之一。
  • 参数:权限ID或名称。
  • 返回:truefalse

用户

神话:Auth 使用 CodeIgniter 实体 作为它的用户对象,您的应用程序也必须使用该类。此类提供自动密码散列以及封禁/解封、密码重置散列生成等实用方法。

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

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

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

用户注册已经为您处理了这一点,并查看 Auth 配置文件的 $defaultUserGroup 设置以获取要添加用户的组名称。请注意,默认情况下不设置 $defaultUserGroup 变量。

工具栏

神话: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 文件中指定了每个路由,则可以使用 Controller Filters 通过组/角色或权限限制对用户的访问。

首先,编辑 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) {
    ...
});

自定义

请参阅 扩展 文档。