sjaakp / yii2-pluto
Yii2的用户管理扩展
Requires
- php: >=7.0.0
- softark/yii2-dual-listbox: ~1.0
- yiisoft/yii2: ~2.0.14
- yiisoft/yii2-bootstrap4: ^2.0
- yiisoft/yii2-swiftmailer: ~2.0
README
Yii2框架的用户管理模块
Pluto是Yii 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
array
为 Pluto 视图的一些方面提供 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' 的情况,将无法管理角色。解决这个问题有几种方法。其中一种是:临时将 Pluto 的 defaultRole
设置为 '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()
接受的任何形式。
覆盖身份类
Pluto 将 sjaakp\pluto\models\User
设置为应用程序 yii\web\User
组件的 identityClass
。如果您雄心勃勃,可能会开发自己的身份类。这个类应该扩展 sjaakp\pluto\models\User
并将其设置为 Pluto 的 identityClass
选项。
Pluto
Pluto 曾经是我认识的一只友好的看门狗的名字。如果您真的讨厌这个名字,只需按以下方式设置模块
<?php
// ...
'modules' => [
'saturnus' => [
'class' => 'sjaakp\pluto\Module',
// several options
],
],
// ...
'bootstrap' => [
'saturnus',
]
// ...
您的用户永远不会遇到 'pluto' 这个名字。
感谢
- rossaddison:英语语法。
- paskuale75:更好的提示,更少的错误。
- ettolo:意大利语翻译。
- Gleb Shaposhnikov:俄语翻译。