atk4 / login
Agile UI 的登录和用户模块
Requires
- php: >=7.4 <8.4
- atk4/ui: ~5.0.0
Requires (Dev)
- atk4/behat-mink-selenium2-driver: ^1.6.2
- behat/mink-extension: ^2.3.1
- ergebnis/composer-normalize: ^2.13
- ergebnis/phpunit-slow-test-detector: ^2.9
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.0
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-strict-rules: ^1.3
- phpunit/phpunit: ^9.5.5
Conflicts
- behat/behat: <3.9
- behat/mink: <1.9
- symfony/console: <4.4.30 || >=5 <5.3.7
- symfony/css-selector: <4.4.24 || >=5 <5.2.9
README
ATK UI 实现了 Web 应用程序的高级用户界面 - 例如 管理系统。对于管理系统,最常见的事情之一就是登录界面。
虽然您可以轻松实现登录表单,但此附加组件为您做了一切
安装
通过 composer 安装 composer require atk4/login
然后,将 Auth
添加到您的应用程序中,并设置合适的用户控制器
$app = new \Atk4\Ui\App(); $app->initLayout([\Atk4\Ui\Layout\Admin::class]); $app->db = new \Atk4\Data\Persistence($dsn); // ADD THIS CODE: $app->auth = new \Atk4\Login\Auth($app); $app->auth->setModel(new \Atk4\Login\Model\User($app->db)); // The rest of YOUR UI code will now be protected \Atk4\Ui\Crud::addTo($app)->setModel(new Client($app->db));
(如果您还没有用户模型,您可以扩展或使用 \Atk4\Login\Model\User)。
功能
这里实现了所有类
- 完全透明的身份验证
- 用当前用户的名称填充用户菜单
- 添加退出链接
- 添加偏好设置页面
- 灵活的 ACL 支持
- Model\User - 可扩展的基本用户实体
- LoginForm - 用户名/密码登录表单
- RegisterForm - 注册表单
- Auth - 身份验证控制器,验证并记录登录状态
- UserAdmin - 用户管理的 UI
- Layout\Narrow - 基于 Fomantic-UI 的窄响应式布局登录/注册表单
- 表单和消息的模板
- 所有上述内容的演示
当使用默认安装时,它将依赖于各种其他组件(如 LoginForm),但您也可以单独使用这些组件。
高级用法
有两种操作模式 - 自动和手动。自动模式会自动处理基于当前登录状态显示表单。这已经在上述“安装”部分中介绍过。
对于更高级的用法,您可以调整自动模式或手动使用单个组件。
调整自动模式
当您初始化 'Auth' 类时,您可以注入属性值
$app->auth = new \Atk4\Login\Auth($app, [ 'hasPreferences' => false, // do not show Preferences page/form 'pageDashboard' => 'dashboard', // name of the page, where user arrives after login 'pageExit' => 'goodbye', // where to send user after logout // Oter options: // 'hasUserMenu' => false, // will disable interaction with Admin Layout user menu ]); $app->auth->setModel(new User($app->db));
使用手动模式
在手动模式下,不会进行任何检查,您需要自己进行用户身份验证。这对于您有更复杂的身份验证逻辑的情况最佳。
$app->auth = new \Atk4\Login\Auth($app, [ 'check' => false, ]); $app->auth->setModel(new User($app->db)); // Now manually use login logic if (!$app->auth->user->isLoaded()) { \Atk4\Login\LoginForm::addTo($app, ['auth' => $app->auth]); }
添加注册表单
\Atk4\Login\RegisterForm::addTo($app) ->setModel(new \Atk4\Login\Model\User($app->db));
显示电子邮件和两个密码字段(用于确认)。如果填写成功,将为 \Atk4\Login\Model\User
创建新的记录。在添加之前将电子邮件转换为小写。要尝试的事情
- 扩展或使用您自己的用户类
- 将更多字段添加到注册表单
- 使用消息和链接装饰注册表单
- 使用多列表单布局
登录表单
\Atk4\Login\LoginForm::addTo($app, [ 'auth' => $app->auth, // 'successLink' => ['dashboard'], // 'forgotLink' => ['forgot'], ]);
显示登录表单并将其与 $auth 关联。当表单填写完毕时,将尝试使用 $auth 的模型进行身份验证。如果密码输入正确,将重定向到 "successLink"(将传递给 $app->url())。要尝试的事情
- 如果未通过身份验证,则重定向到登录页面
- 添加第三方身份验证(使用第三方库进行身份验证,查找关联的账户,存储到身份验证持久化中)
- 实现两步验证(在身份验证持久化中存储标志,指示是否执行了第二步,如果没有则显示它)
- 在多次不成功尝试后实施密码验证延迟
- 如果密码即将过期,请要求用户更改密码
仪表板
检查用户是否当前已登录
if ($app->auth->user->isLoaded()) { // logged-in }
身份验证模型将用户模型数据存储在会话中,因此如果您从数据库中删除用户,他不会自动注销。要显式注销用户,请调用 $app->auth->logout()
。
您也可以这样访问用户数据: $app->auth->model['name']
;要尝试的事情
- 显式从数据库加载用户记录而不是仅从缓存中加载
- 在数据库中存储最后登录/最后访问时间
- 将认证缓存移动到MemCache
用户资料表单
此表单允许用户更改用户数据(包括密码),但前提是用户已认证。要实现用户资料表单,请使用
Form::addTo($app)->setModel($app->auth->user);
示例代码在弹窗中打开用户资料表单,如果您希望这样做,可以使用此代码
Button::addTo($app, ['Profile', 'class.primary' => true]) ->on('click', Modal::addTo($app)->set(function (View $p) { Form::addTo($p)->setModel($p->getApp()->auth->user); })->jsShow());
尝试事项
- 在更改设置之前要求用户验证旧密码
- 如果任何用户设置已更改,则发送短信通知/电子邮件
- 在多个表中存储用户设置(连接)
密码
字段 'password' 使用自定义字段类 Password
。存储的值始终是哈希,使用 Password::hashPassword()
+ Password::set()
方法设置值,或使用 Password::setPassword()
方法直接设置密码。您可以在任何模型中使用此字段,例如这样
$model->addField('password', [\Atk4\Data\Field\PasswordField::class]);
此外,密码不会存储在会话缓存中,也无法直接访问。
尝试事项
- 添加复杂度验证
- 添加密码恢复表单
- 在恢复密码时使用CAPTCHA
自定义用户模型
尽管提供了一个基本的用户模型,但您可以选择扩展它或使用自己的用户模型。
用户管理员
我们包含了一个稍微扩展的“管理员”界面,其中包括查看用户详情和更改其密码的页面。要创建管理员页面,请使用
\Atk4\Login\UserAdmin::addTo($app) ->setModel(new \Atk4\Login\Model\User($app->db));
这使用标准的CRUD接口,并通过添加额外的操作进行增强
- 主按钮允许更改用户密码并提供随机密码生成器。使用“input”字段显示可见密码。您还可以使用常规的“编辑”按钮,该按钮将包含受星号保护的密码字段。
- 眼睛按钮的设计是为了显示用户详情,例如他属于哪个组。目前,此面板和组尚未实现。
尝试事项
- 在详情模态中添加更多信息。
- 添加用户操作审计日志(登录、更改密码等)
迁移
迁移的使用是可选的,但可以帮助填充用户模型的初始结构。查看文件 demos/wizard.php
。它简单添加了一个控制台组件,该组件将执行“User”模型的迁移。
当执行迁移时,它简单地检查确保“user”表存在并且具有所有所需的字段。它不会删除或更改现有的字段或表。
路线图
通常我们希望保持此插件简洁,但非常灵活,包含各种教程,说明如何实现各种场景(如“尝试事项”下所述)。
对于其中一些功能,我们希望在下一个版本中提供更好的支持。
- [1.0] - 添加 "$auth->check()" - 用于自动认证检查
- [1.1] - 添加密码提示表单和与电子邮件/短信发送集成的教程
- [1.2] - 添加密码强度验证(和指示器)
如果您想提出其他功能,请在此处提出建议: