atk4/login

Agile UI 的登录和用户模块

5.0.0 2024-03-26 18:55 UTC

This package is auto-updated.

Last update: 2024-09-16 14:57:58 UTC


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)。

Login

功能

这里实现了所有类

  • 完全透明的身份验证
    • 用当前用户的名称填充用户菜单
    • 添加退出链接
    • 添加偏好设置页面
  • 灵活的 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 创建新的记录。在添加之前将电子邮件转换为小写。要尝试的事情

  • 扩展或使用您自己的用户类
  • 将更多字段添加到注册表单
  • 使用消息和链接装饰注册表单
  • 使用多列表单布局

登录表单

Login

\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));

Login

这使用标准的CRUD接口,并通过添加额外的操作进行增强

  • 主按钮允许更改用户密码并提供随机密码生成器。使用“input”字段显示可见密码。您还可以使用常规的“编辑”按钮,该按钮将包含受星号保护的密码字段。
  • 眼睛按钮的设计是为了显示用户详情,例如他属于哪个组。目前,此面板和组尚未实现。

Login

尝试事项

  • 在详情模态中添加更多信息。
  • 添加用户操作审计日志(登录、更改密码等)

迁移

迁移的使用是可选的,但可以帮助填充用户模型的初始结构。查看文件 demos/wizard.php。它简单添加了一个控制台组件,该组件将执行“User”模型的迁移。

当执行迁移时,它简单地检查确保“user”表存在并且具有所有所需的字段。它不会删除或更改现有的字段或表。

路线图

通常我们希望保持此插件简洁,但非常灵活,包含各种教程,说明如何实现各种场景(如“尝试事项”下所述)。

对于其中一些功能,我们希望在下一个版本中提供更好的支持。

  • [1.0] - 添加 "$auth->check()" - 用于自动认证检查
  • [1.1] - 添加密码提示表单和与电子邮件/短信发送集成的教程
  • [1.2] - 添加密码强度验证(和指示器)

如果您想提出其他功能,请在此处提出建议: