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

v1.2.8 2024-05-15 17:17 UTC

This package is auto-updated.

Last update: 2024-09-15 18:04:49 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 之外的缓存引擎,并且已正确设置。后台将为您处理 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用户指南中有关Code模块支持的章节。

服务

以下服务由该包提供

身份验证

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

    $authenticate = service('authentication');

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

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

授权

提供对Myth:Auth所知的任何授权库的访问。默认情况下,它将返回“Flat”授权库,这是根据NIST定义的Flat 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实例。
  • 参数:无
  • 返回:当前用户实体,或null

user_id()

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

in_groups()

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

has_permission()

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

用户

误区:Myth:Auth 使用 CodeIgniter 实体 来表示其用户对象,并且您的应用程序也必须使用该类。此类提供自动密码哈希以及用于封禁/解封、密码重置哈希生成等的功能方法。

它还提供了一个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/*']],
];

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

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

自定义

请参阅 扩展 文档。