sjaakp/yii2-pluto

Yii2的用户管理扩展

安装次数: 1,345

依赖项: 1

建议者: 0

安全: 0

星标: 8

关注者: 4

分支: 12

开放问题: 21

类型:yii2-extension

1.0.13 2024-06-29 13:40 UTC

This package is auto-updated.

Last update: 2024-08-29 13:57:03 UTC


README

Yii2框架的用户管理模块

Latest Stable Version Total Downloads License

PlutoYii 2.0 PHP框架的完整用户管理模块。

它管理用户的登录和注销、注册、邮箱确认、阻止和分配角色。用户可以更改他们的邮箱地址、请求重置密码。网站管理员可以定义角色和权限,并将权限分配给角色。

Pluto的演示在此

先决条件

Pluto依赖于基于角色的访问控制 (RBAC)。因此,必须配置authManager应用程序组件。Pluto可以与Yii的PhpManager以及DbManager一起工作。

由于Pluto发送电子邮件,因此必须确保应用程序的mailer组件正在运行。请确保应用程序的'adminEmail'参数具有合理的值。如果您愿意,也可以设置'supportEmail'参数;如果设置了该参数,Pluto将使用它。

Pluto使用Yii2 闪存消息,因此还必须进行配置。如果网站是使用Yii的一个项目模板设置的,那么这将被处理。

安装

使用Composer以通常方式安装yii2-pluto。将以下内容添加到您的composer.json文件的require部分

"sjaakp/yii2-pluto": "*"

或者运行

composer require sjaakp/yii2-pluto

您可以通过下载ZIP格式的源代码手动安装yii2-pluto

模块

Pluto是Yii2框架中的一个模块。它必须在主配置文件中进行配置,通常称为config目录中的web.php。将以下内容添加到配置数组中

<?php
// ...
'modules' => [
    'pluto' => [
        'class' => 'sjaakp\pluto\Module',
        // several options
    ],
],
// ...

模块必须被引导。通过将以下内容添加到应用程序配置数组中来实现这一点

<php
// ...
'bootstrap' => [
    'pluto',
]
// ...

配置文件中可能已经存在一个bootstrap属性;只需将'pluto'添加到其中即可。

重要:模块还必须在控制台配置(通常称为console.php)中以相同的方式进行设置。请注意,在某些配置中,可能存在一个包含Web和控制台层配置的main.php文件。一个值得注意的例子是Yii2高级模板

控制台命令

为了完成安装,需要运行两个控制台命令。第一个将创建用户数据库表

yii migrate

应用迁移的名称为sjaakp\pluto\migrations\m000000_000000_init

第二个控制台命令是

yii pluto

这将设置基本角色和权限。

动作

Pluto 为应用程序添加了许多 动作。其中最重要的包括

角色

安装 Pluto 后,网站可以识别两个用户角色和一些权限。更多关于它们的信息,请参阅 Yii-guide 中的授权章节。已安装的角色包括

集成到用户界面

现在 Pluto 已经安装,需要将其集成到网站的用户界面中。有几十种实现方式,但以下是一些一般性指南

  • 应该向 guest user 提供登录的机会。 Pluto 的登录界面提供了为新用户注册(注册)、重置密码的选项。
  • 应该向 authenticated 用户提供退出的机会,以及更改设置等。
  • 具有特殊权限的用户应该有权访问 Pluto 的用户管理页面等。

LoginMenu 是一个用于将 Pluto 集成到网站主菜单的部件

<?php
use ...
use sjaakp\pluto\widgets\LoginMenu

$user = Yii::$app->user;

$navItems = [
    ['label' => 'Home', 'url' => '/' ],
    // ...
    ['label' => 'About', 'url' => ['/site/about']],
    // ... more menu items ...,
    LoginMenu::widget([
        'options' => [
           'class' => 'bg-primary'
        ]
    ]),
];

NavBar::begin([
    'options' => [
        'class' => '... navbar-dark bg-primary',
    ],
    // ... more NavBar options ...
]);
echo Nav::widget([
    'items' => $navItems,
]);
NavBar::end();

请确保给 LoginMenu 赋予与 NavBar 相同的背景定义 CSS 类,例如 bg-primary

选项

Pluto 模块具有广泛的功能选项。它们在应用程序配置中设置,如下所示

 <?php
 // ...
 'modules' => [
     'pluto' => [
         'class' => 'sjaakp\pluto\Module',
         'passwordHint' => 'At least eight characters, one uppercase, one digit',
         // ...
         // ... more options ...
     ],
 ],
 // ...

选项(所有都是可选的)包括

  • viewOptions arrayPluto 视图的一些方面提供 CSS 选项,以下是一些键值对。针对 Bootstrap4 优化。
    • 'row' 外部 'row'-div 的选项。默认值:[ 'class' => 'row justify-content-center' ]
    • 'col' 同样是内部 'col'-div 的选项。默认:[ 'class' => 'col-md-6 col-lg-5' ]
    • 'button' 视图主要按钮的选项。默认:[ 'class' => 'btn btn-success' ]
    • 'link' 次级链接的选项。默认:[ 'class' => 'btn btn-sm btn-secondary' ]
  • views array 请参阅 下面。默认:[]
  • mailOptions array 应用程序邮件发送器 的选项。默认:请参阅源代码。
  • passwordFlags array 密码输入的选项。键:任何动作 ID(如 'login' 或 'forgot'),或 'all'(表示所有动作)。值:以下标志的字符串或数组。默认:[ 'all' => 'reveal' ]
    • 'reveal' 密码输入有一个小的 'reveal'-按钮。
    • 'double' 用户必须填写两次密码(不影响 'forgot''resend')。
    • 'captcha' 对话框有 验证码字段
  • passwordRegexp string 正则表达式,用于匹配密码。复杂示例:'/^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$/'(表示:至少 8 个字符,其中至少有一个小写字母,一个大写字母和一个数字。要实验,请使用类似 Live Regex 的网站。默认:'/^\S*(?=\S{6,})\S*$/'
  • passwordHint string 上面的文本表示。默认:'至少 6 个字符'
  • defaultRole null|string|array 分配给新用户的角色。默认:null
  • firstDefaultRole null|string|array 分配给 第一个 新用户的角色。默认:'admin'
  • ruleNamespace string 规则类(条件)的命名空间。默认:'app\rbac'
  • tokenStamina 整数 已发送的email-token有效状态的持续时间。默认:21600(六小时)。
  • loginStamina 整数 '记住我'的持续时间。默认:2592000(三十天)。
  • formClass null|string 用于表单的Yii2类。如果为null,则在'bootstrap'命名空间中设置为ActiveForm。默认:null
  • multipleRoles 布尔值 是否可以将多个角色分配给用户。在我看来,这通常是一个非常糟糕的想法。因此,默认:false
  • fenceMode 布尔值|string 网站是否“处于围栏之后”,即对访客用户完全不可访问。每个页面都导向登录界面。非常适合开发阶段。也可以是一个权限名称,在这种情况下,只有拥有此权限的用户才能获得访问权限。适用于具有单独'admin'子域的网站。默认:false
  • profileClass null|string|array 用于个人资料的类的名称。也可以是一个配置数组。默认:null
  • identityClass 字符串 与当前用户关联的标识对象的类名。可以更改为从sjaakp\pluto\models\User扩展的类。默认:'sjaakp\pluto\models\User'

个人资料

除了User模型外,用户还可以有个人资料模型。它可以存储额外的公共信息:简短的个人简介、个人照片、头像、位置等。《Pluto》本身不实现个人资料模型,但它支持它。

个人资料是一个标准的ActiveRecord,具有一个非常重要但不同的特性:id字段不是自动增长的

相反,个人资料数据库表中的id字段应声明为UNIQUE。个人资料采用与它关联的User相同的id

个人资料模型应在《Pluto》的配置中作为profileClass进行配置。

除了类名外,还可以用配置数组初始化'profile'组件,其中类名作为'class'元素的值,就像在Yii2王国中的许多其他地方一样。

在这种设置下,《Pluto》将为每个注册用户自动创建一个个人资料。如果删除User,她的个人资料也将被删除。

角色、权限等

对于新手来说,角色和权限可能会令人望而生畏。《Yii-guide》的授权章节提供了一些帮助。基本上,角色被分配给用户,而权限用于构建网站。每个角色都被分配一个或多个权限

角色权限都可以受条件(Yii2将这些称为'规则')的影响。它们作为扩展自yii\rbac\Rule的PHP类实现。Pluto'app\rbac'(由选项ruleNamespace设置)命名空间下查找未注册的条件,并为'admin'提供注册它们的机会。

《Pluto》在角色和权限方面避免使用有点误导性的术语“子”。相反,它使用“包含角色”或“包含权限”。

注册第一个'admin'用户

默认设置下,Pluto 会自动将 'admin' 角色分配给第一个注册的用户。如果之后出现没有注册 'admin' 的情况,将无法管理角色。解决这个问题有几种方法。其中一种是:临时将 PlutodefaultRole 设置为 'admin'。临时性的重要性不容忽视。你永远不希望这个设置在实时网站上。

验证码

Pluto 支持Yii2的标准 验证码,以及谷歌的 reCaptcha v2(“我不是机器人”)。当其中一个 passwordFlags 设置为 'captcha' 时,将显示验证码挑战对话框。如果网站上安装了 himiklab/yii2-recaptcha-widget,则将使用谷歌的 reCaptcha v2,否则使用 Yii2 的标准验证码。

国际化

Pluto 的所有表述都可以翻译。翻译文件位于 'sjaakp\pluto\messages' 目录。

您可以通过在主配置中设置应用程序的 消息源 来覆盖 Pluto 的翻译,如下所示

<?php
// ...
'components' => [
    // ... other components ...     
    'i18n' => [
         'translations' => [
              // ... other translations ...
             'pluto' => [    // override pluto's standard messages
                 'class' => 'yii\i18n\PhpMessageSource',
                 'basePath' => '@app/messages',  // this is a default
                 'sourceLanguage' => 'en-US',    // this as well
             ],
         ],
    ],
    // ... still more components ...
]

翻译应放在名为 'pluto.php' 的文件中。

如果您只想翻译单个或少数几个消息,并使用 Pluto 的翻译作为主要部分,那么设置 'i18n' 如上,并编写您的翻译文件,如下所示

 <?php
 // app/messages/nl/pluto.php
 
 $plutoMessages = Yii::getAlias('@sjaakp/pluto/messages/nl/pluto.php');
 
 return array_merge (require($plutoMessages), [
    'Settings' => 'Instellingen',   // your preferred translation
 ]);

目前,只实现了意大利语、俄语和荷兰语。诚然,荷兰语只是世界上 第52种语言,但恰好是我的母语。请邀请您将 Pluto 翻译成其他语言。我将非常乐意将它们纳入 Pluto 的下一个版本。

覆盖视图文件

Pluto 的任何视图文件都可以覆盖,例如添加标志或更改结构。只需将模块的 views 设置为类似以下内容

 <?php
 // ...
 'modules' => [
     'pluto' => [
         'class' => 'sjaakp\pluto\Module',
         'views' => [
              'default' => [    // Pluto controller id
                  'login' => <view file>    // action => view
              ]
         ],
         // ...
         // ... more options ...
     ],
 ],
 // ...

<view file> 可以是 yii\web\controller::render() 接受的任何形式。

覆盖身份类

Plutosjaakp\pluto\models\User 设置为应用程序 yii\web\User 组件的 identityClass。如果您雄心勃勃,可能会开发自己的身份类。这个类应该扩展 sjaakp\pluto\models\User 并将其设置为 PlutoidentityClass 选项。

Pluto

Pluto 曾经是我认识的一只友好的看门狗的名字。如果您真的讨厌这个名字,只需按以下方式设置模块

<?php
// ...
'modules' => [
    'saturnus' => [
        'class' => 'sjaakp\pluto\Module',
        // several options
    ],
],
// ...
'bootstrap' => [
    'saturnus',
]
// ...

您的用户永远不会遇到 'pluto' 这个名字。

感谢

  • rossaddison:英语语法。
  • paskuale75:更好的提示,更少的错误。
  • ettolo:意大利语翻译。
  • Gleb Shaposhnikov:俄语翻译。