myth / auth
适用于CodeIgniter 4的灵活认证/授权系统。
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- codeigniter4/codeigniter4-standard: ^1.0
- codeigniter4/devkit: ^1.0
- codeigniter4/framework: ^4.1
- mockery/mockery: ^1.0
Provides
This package is auto-updated.
Last update: 2024-09-09 20:31:21 UTC
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 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库。在您的应用程序中,执行以下设置
-
编辑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 所知任意的认证包的访问。默认情况下,它将返回 "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()
- 函数:检查是否有任何用户登录。
- 参数:无
- 返回:
true
或false
user()
- 函数:返回当前登录用户的 User 实例。
- 参数:无
- 返回:当前 User 实体或
null
user_id()
- 函数:返回当前登录用户的 User ID。
- 参数:无
- 返回:当前 User 的整数 ID 或
null
in_groups()
- 函数:确保当前用户至少在传入的组之一中。
- 参数:组ID或名称,可以是单个项或项数组。
- 返回:
true
或false
has_permission()
- 功能:确保当前用户具有传入权限之一。
- 参数:权限ID或名称。
- 返回:
true
或false
用户
神话: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'])
过滤器可以是 role
或 permission
,它通过组或权限限制路由。您必须添加一个以逗号分隔的组或权限列表,以检查已登录用户。
限制路由组
同样,可以在 group()
方法中限制整个路由组
$routes->group('admin', ['filter' => 'role:admin,superadmin'], function($routes) { ... });
自定义
请参阅 扩展 文档。