Winter/wn-user-plugin

Winter CMS的用户插件

资助包维护!
Winter CMS
Open Collective

安装量: 19,515

依赖关系: 19

建议者: 0

安全: 0

星标: 10

关注者: 6

分支: 20

公开问题: 10

类型:Winter 插件

v2.2.2 2024-07-18 18:35 UTC

This package is auto-updated.

Last update: 2024-09-19 01:52:15 UTC


README

Build Status MIT License

Winter CMS的前端用户管理。

要求

此插件需要包含Snowboard 框架或原始的Ajax 框架到您的布局或页面中,以便处理表单请求。

管理用户

用户在后台的“用户”标签页中进行管理。每个用户提供最小数据字段 - 姓名姓氏电子邮件密码。姓名可以代表个人的名字或全名,使得姓氏字段根据您网站的结构是可选的。

电子邮件字段下方有一个复选框,可以阻止向用户发送所有发出的邮件。这对于有电子邮件地址无法接收邮件或报告了垃圾邮件的账户来说是一个有用的功能。当勾选时,除用于重置密码的邮件模板外,永远不会向此地址发送邮件。

插件设置

此插件创建了一个设置菜单项,可以通过导航到设置 > 用户 > 用户设置找到。此页面允许设置常用功能,以下将详细介绍。

注册

默认允许网站注册。如果您正在运行一个封闭网站或需要暂时禁用注册,您可以通过将允许用户注册切换到关闭设置来禁用此功能。

激活

激活是审核加入网站的用户的流程。默认情况下,用户在注册时自动激活,需要激活的账户才能登录。

激活模式指定激活工作流程

  • 自动:此模式将在用户首次注册时自动激活用户。这与完全禁用激活相同,是默认设置。
  • 用户:用户可以通过回复发送到其指定的电子邮件地址的确认消息来激活其账户。
  • 管理员:用户只能通过后台区域的管理员激活。

您可以通过将登录需要激活切换到关闭设置来允许用户在不激活的情况下登录。这对于最小化注册时的摩擦很有用,但是采用这种方法时,通常在用户激活之前禁用任何“身份敏感”的功能,例如发布内容。或者,您可以实施一个宽限期,在此期间删除在指定时间内未激活的用户(有足够的警告!)。

用户可以通过在账户组件中点击重新发送验证邮件来重新发送激活邮件。

登录

默认情况下,用户将使用他们的电子邮件地址作为唯一标识符登录网站。您可以通过将登录属性值更改为“用户名”来使用唯一的登录名。这将为每个用户引入一个新的字段,称为用户名,允许他们指定自己的简称或别名进行识别。电子邮件地址和用户名都必须对用户是唯一的。

如果用户多次尝试登录失败,他们的账户将被暂时冻结一段时间。此功能默认启用,在给定IP地址的5次登录尝试失败后,将暂停账户15分钟。您可以通过将限制尝试次数切换到关闭设置来禁用此功能。

作为安全预防措施,您可以限制用户同时在多个设备上拥有会话。启用防止并发会话设置以使用此功能。当用户登录到他们的账户时,它将自动使所有其他会话的用户注销。

通知

当用户首次激活时——无论是通过注册、电子邮件确认还是管理员批准——都会发送一封欢迎邮件。要禁用欢迎邮件,从欢迎邮件模板下拉菜单中选择“不发送通知”。默认的消息模板是winter.user::mail.welcome,您可以通过从设置菜单中选择邮件 > 邮件模板来自定义此模板。

会话组件

会话组件应该添加到已注册用户的布局中。它没有默认的标记。

用户变量

您可以通过访问{{ user }} Twig变量来检查已登录用户

{% if user %}
    <p>Hello {{ user.name }}</p>
{% else %}
    <p>Nobody is logged in</p>
{% endif %}

注销

会话组件允许用户注销他们的会话。

<a href="javascript:;" data-request="onLogout" data-request-data="redirect: '/good-bye'">Sign out</a>

页面限制

会话组件允许通过仅允许已登录用户、仅允许访客或没有任何限制来限制页面或布局。以下示例展示了如何仅限制用户访问页面

title = "Restricted page"
url = "/users-only"

[session]
security = "user"
redirect = "home"

security属性可以是用户、访客或所有。redirect属性指的是在访问受限时重定向到的页面名称。

路由限制

可以通过应用AuthMiddleware来限制对路由的访问。

Route::group(['middleware' => 'Winter\User\Classes\AuthMiddleware'], function () {
    // All routes here will require authentication
});

账户组件

账户组件提供用户登录表单、注册表单、激活表单和更新表单。要显示表单

title = "Account"
url = "/account/:code?"

[account]
redirect = "home"
paramCode = "code"
==
{% component 'account' %}

如果用户注销,这将显示登录和注册表单。否则,它将显示更新表单。redirect属性是提交过程完成后重定向到的页面名称。paramCode是用于激活用户的URL路由代码,仅在启用此功能时使用。

重置密码组件

重置密码组件允许用户在忘记密码时重置密码。

title = "Forgotten your password?"
url = "/forgot-password/:code?"

[resetPassword]
paramCode = "code"
==
{% component 'resetPassword' %}

这将显示初始恢复请求表单以及用户收到验证电子邮件后使用的密码重置表单。paramCode是用于重置密码的URL路由代码。

使用登录名

默认情况下,用户插件将使用电子邮件地址作为登录名。要切换到使用用户定义的登录名,请导航到系统 > 用户 > 用户设置,并在“登录”选项卡下将登录属性更改为用户名。然后只需在注册时添加用户名字段即可要求用户提供用户名。

<form data-request="onRegister">
    <label>Full Name</label>
    <input name="name" type="text" placeholder="Enter your full name">

    <label>Email</label>
    <input name="email" type="email" placeholder="Enter your email">

    <label>Username</label>
    <input name="username" placeholder="Pick a login name">

    <label>Password</label>
    <input name="password" type="password" placeholder="Choose a password">

    <button type="submit">Register</button>
</form>

我们还可以在此处添加其他任何附加字段,例如phonecompany等。

密码长度要求

默认情况下,用户插件在用户注册或更改密码时要求所有用户的密码长度至少为8个字符。您可以通过访问config/config.php来更改此长度要求。在文件中,将minPasswordLength参数的值更改为自己的。

错误处理

闪存消息

此插件使用Winter CMS的闪存API。为了显示错误消息,您需要将以下片段放置在您的布局或页面中。

{% flash %}
    <div class="alert alert-{{ type == 'error' ? 'danger' : type }}">{{ message }}</div>
{% endflash %}

AJAX错误

用户插件默认将AJAX错误消息显示在一个简单的alert()框中。然而,这可能会吓到非技术用户。您可以将AJAX错误的默认行为从显示alert()消息更改为以下内容:

<script>
    $(window).on('ajaxErrorMessage', function (event, message) {

        // This can be any custom JavaScript you want
        alert('Something bad happened, mate, here it is: ' + message);

        // This will stop the default alert() message
        event.preventDefault();

    })
</script>

检查登录名是否已被占用

注意:实现以下示例可能存在隐私风险,因为它允许未经身份验证的用户查询您的服务,以查看给定的电子邮件地址是否已注册您的服务。

以下是一个简单的示例,说明您如何快速检查电子邮件地址/用户名是否在您的注册表单中可用。首先,在页面代码中,定义以下AJAX处理程序来检查登录名,这里我们使用电子邮件地址

public function onCheckEmail()
{
    return ['isTaken' => Auth::findUserByLogin(post('email')) ? 1 : 0];
}

对于电子邮件输入,我们使用data-requestdata-track-input属性来调用onCheckEmail处理程序,任何时间字段更新时都会调用该处理程序。data-request-success属性将调用一些jQuery代码来切换警告框。

<div class="form-group">
    <label>Email address</label>
    <input
        name="email"
        type="email"
        class="form-control"
        data-request="onCheckEmail"
        data-request-success="$('#loginTaken').toggle(!!data.isTaken)"
        data-track-input />
</div>

<div id="loginTaken" class="alert alert-danger" style="display: none">
    Sorry, that login name is already taken.
</div>

覆盖功能

以下是如何覆盖onSignin()处理程序以记录任何错误消息。在页面代码中,定义此方法

function onSignin()
{
    try {
        return $this->account->onSignin();
    }
    catch (Exception $ex) {
        Log::error($ex);
    }
}

在这里,本地处理程序方法将优先于account组件的事件处理程序。然后我们通过手动调用组件对象($this->account)来继承逻辑。

认证外观

有一个Auth外观可以用于常见任务,它主要继承自Winter\Storm\Auth\Manager类以实现功能。

您可以使用Auth::register来注册账户

$user = Auth::register([
    'name' => 'Some User',
    'email' => 'some@website.tld',
    'password' => 'changeme',
    'password_confirmation' => 'changeme',
]);

第二个参数可以指定账户是否应自动激活

// Auto activate this user
$user = Auth::register([...], true);

Auth::check方法是一种快速检查用户是否已登录的方法。

// Returns true if signed in.
$loggedIn = Auth::check();

要返回已登录的用户模型,请使用Auth::getUser

// Returns the signed in user
$user = Auth::getUser();

您可以通过提供用户的登录名和密码使用Auth::authenticate来认证用户。

// Authenticate user by credentials
$user = Auth::authenticate([
    'login' => post('login'),
    'password' => post('password')
]);

第二个参数用于为用户存储一个不会过期的cookie。

$user = Auth::authenticate([...], true);

您也可以通过传递用户模型和Auth::login来简单地作为用户认证。

// Sign in as a specific user
Auth::login($user);

第二个参数相同。

// Sign in and remember the user
Auth::login($user, true);

您可以使用Auth::findUserByLogin方法通过登录名查找用户。

$user = Auth::findUserByLogin('some@email.tld');

访客用户

创建访客用户允许将注册过程推迟。例如,在不先注册的情况下进行购买。访客用户无法登录,并将被添加到代码为guest的用户组中。

使用Auth::registerGuest方法创建访客用户,它将返回一个用户对象,可以多次调用。唯一标识符是电子邮件地址,这是一个必填字段。

$user = Auth::registerGuest(['email' => 'person@acme.tld']);

当用户使用Auth::register方法以相同的电子邮件地址注册时,他们将继承现有的访客用户账户。

// This will not throw an "Email already taken" error
$user = Auth::register([
    'email' => 'person@acme.tld',
    'password' => 'changeme',
    'password_confirmation' => 'changeme',
]);

重要:如果您使用访客账户,请务必禁用未验证用户账户的敏感功能,因为可能任何人都可以继承访客账户。

您还可以使用 convertToRegistered 方法将访客转换为注册用户。这将生成一个随机密码,并使用 winter.user::mail.invite 模板发送邀请。

$user->convertToRegistered();

要禁用通知和密码重置,将第一个参数传递为 false。

$user->convertToRegistered(false);

事件

此插件将触发一些全局事件,这些事件可用于与其他插件交互。

  • winter.user.beforeRegister:在处理用户注册之前。通过引用传递 $data 变量,以便可以直接修改传递给 Auth::register() 方法的 $data
  • winter.user.register:用户已成功注册。传递了 $user 对象和提交的 $data 变量。
  • winter.user.beforeAuthenticate:在用户尝试使用账户组件进行认证之前。
  • winter.user.login:用户已成功登录。
  • winter.user.logout:用户已成功登出。
  • winter.user.activate:用户通过电子邮件验证激活了他们的账户。
  • winter.user.deactivate:用户通过停用账户退出了网站。这应该用于禁用用户可能希望删除的任何内容。
  • winter.user.reactivate:用户通过重新登录重新激活了他们的账户。这应该恢复用户在网站上的内容。
  • winter.user.getNotificationVars:在发送用户通知时触发,以便将更多变量传递给电子邮件模板。传递模板将为 $user 模型。
  • winter.user.view.extendListToolbar:在渲染用户列表页面的工具栏时触发。
  • winter.user.view.extendPreviewToolbar:在渲染用户预览页面的工具栏时触发。

以下是一个绑定事件的示例

Event::listen('winter.user.deactivate', function($user) {
    // Hide all posts by the user
});

一个常见的需求是将另一个适配到旧版认证系统。在下面的示例中,WordPressLogin::check 方法将使用替代散列方法检查用户密码,如果成功,则更新为 Winter CMS 使用的密码。

Event::listen('winter.user.beforeAuthenticate', function($component, $credentials) {
    $login = array_get($credentials, 'login');
    $password = array_get($credentials, 'password');

    /*
     * No such user exists
     */
    if (!$user = Auth::findUserByLogin($login)) {
        return;
    }

    /*
     * The user is logging in with their old WordPress account
     * for the first time. Rehash their password using the new
     * Winter CMS system.
     */
    if (WordPressLogin::check($user->password, $password)) {
        $user->password = $user->password_confirmation = $password;
        $user->forceSave();
    }
});