blastanders / myth-auth
适用于CodeIgniter 4的灵活认证/授权系统。增加了使用认证应用程序支持双因素认证。
Requires
- php: ^7.4 || ^8.0
- robthree/twofactorauth: ^1.8
Requires (Dev)
- codeigniter4/codeigniter4-standard: ^1.0
- codeigniter4/devkit: ^1.0
- codeigniter4/framework: ^4.1
- mockery/mockery: ^1.0
Provides
README
适用于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 库。在您的应用程序中执行以下设置
-
编辑 app/Config/Email.php 并确认已设置 fromName 和 fromEmail,因为它们用于发送密码重置等电子邮件。
-
编辑 app/Config/Validation.php 并将以下值添加到 ruleSets 数组中:
\Myth\Auth\Authentication\Passwords\ValidationRules::class
-
确保您的数据库设置正确,然后运行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 知道的任何身份验证包的访问。默认情况下,它将返回“本地身份验证”库,这是一个基于密码的基本系统。
$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()
- 函数:检查是否有用户已登录。
- 参数:无
- 返回:
true
或false
user()
- 功能:返回当前登录用户的User实例。
- 参数:无
- 返回:当前用户实体,或
null
user_id()
- 功能:返回当前登录用户的用户ID。
- 参数:无
- 返回:当前用户的整数ID,或
null
in_groups()
- 功能:确保当前用户在传递的组中至少有一个。
- 参数:组ID或名称,可以是单个项或项数组。
- 返回:
true
或false
has_permission()
- 功能:确保当前用户至少有一个传递的权限。
- 参数:权限ID或名称。
- 返回:
true
或false
用户
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'])
过滤器可以是role
或permission
,这会根据组或权限来限制路由。您必须添加一个以逗号分隔的组或权限列表,以检查已登录用户。
限制路由组
同样,可以在group()
方法中限制整个路由组
$routes->group('admin', ['filter' => 'role:admin,superadmin'], function($routes) { ... });
自定义
请参阅扩展文档。