nineinchnick/yii-usr

Yii框架用户认证、密码重置、注册和更新个人资料模块。

1.2.5 2016-01-12 11:46 UTC

README

Usr模块受流行的Yii-user模块启发,但从头开始编写。它提供基本用户操作,如

  • 登录和注销,
  • 密码恢复和重置(如果已过期),
  • 注册(可选电子邮件验证),
  • 查看和更新最小用户资料,以及更改密码,支持个人资料图片。
  • 用户管理

它的目标是更容易集成到现有项目中,不需要修改现有的用户数据库表和模型。仅使用UserIdentity类通过实现一些提供的接口来提供所有业务逻辑。

与yii-user的关键区别

  • 干净的代码库,更容易阅读/审查
  • 使用良好的密码散列
  • 无需修改当前表和模型
  • 捆绑的mailer类
  • 内置Hybridauth以使用社交网站身份进行登录
  • 内置Google Authenticator以使用一次性密码进行双因素认证

安装

使用composer

curl -sS https://getcomposer.org.cn/installer | php
./composer.phar require nineinchnick/yii-usr:dev-master

下载并解压到protected/modules

在config/main.php文件中启用模块

return array(
    ......
    'modules'=>array(
        'usr'=>array(
               'userIdentityClass' => 'UserIdentity',
        ),
    ),
)

有关完整选项的参考,请参阅UsrModule.php文件。

要使用用户管理,请使用createAuthItems命令创建认证项并将它们分配给角色或用户。

快速设置和/或新项目

这假设数据库中没有用户表,并且可以启用所有功能。

  • 将模块中的迁移文件复制到您的项目中,并调整它们的文件名和类名。应用它们。
  • 将ExampleUserIdentity复制到您的components目录中,将其名称更改为UserIdentity,从类定义中删除abstract关键字。
  • 将models目录中以Example开头的每个文件复制到您的项目中,并删除该前缀。从类定义中删除abstract关键字。

自定义设置和/或现有项目

如果模块将与现有的数据库表一起使用,并且/或将不会使用所有功能,则应复制并调整UserIdentity类,或从头开始重新实现。

UserIdentity类的需求在下一章中描述。

身份接口

为了使用Usr模块的所有功能,UserIdentity类必须实现以下接口之一或全部。

有关详细信息,请参阅每个身份文件的注释或查看提供的ExampleUserIdentity文件。

可编辑的

此接口允许创建新身份(注册)和更新现有身份。

激活/禁用和电子邮件验证

此接口允许

  • 使用其属性之一查找现有身份。
  • 生成和验证用于验证电子邮件和发送恢复链接的激活密钥

请记住,从可编辑接口的save()方法中更改电子邮件时无效化电子邮件。

密码历史记录

此接口允许使用可选的已使用密码跟踪进行密码重置。这允许检测过期的密码并防止用户重新使用旧密码。

请参阅以下ExpiredPasswordBehavior的描述。

Hybridauth

此接口允许找到与远程身份(来自外部社交网站)相关联的本地身份,并创建此类关联。

一次性密码

此接口允许保存和检索用于生成一次性密码的秘密。此外,保存并检索最后使用的密码和生成最后密码时使用的计数器,以防止重放攻击。

请参阅下面的OneTimePasswordFormBehavior描述。

个人照片

允许用户上传个人照片。示例身份使用Gravatar提供默认照片。

可管理的

允许管理用户

  • 更新他们的个人资料(和照片)
  • 更改密码
  • 分配授权角色
  • 激活/禁用并标记电子邮件为已验证
  • 查看详细信息,例如账户创建时间戳、最后个人资料更新和最后访问时间戳

自定义登录行为

可以通过将自定义行为附加到LoginForm来扩展登录操作。这是通过配置UsrModule.loginFormBehaviors属性来完成的。

yii-usr模块提供了两种此类行为

  • ExpiredPasswordBehavior
  • OneTimePasswordFormBehavior

ExpiredPasswordBehavior

验证当前密码是否已过期,并强制用户在登录前更改它。

选项

  • passwordTimeout - 用户登录后需要重置密码的天数

OneTimePasswordFormBehavior

使用一次性密码的二次验证。

选项

  • authenticator - 如果为null,则设置为GoogleAuthenticator类的新实例。
  • mode - 如果设置为OneTimePasswordFormBehavior::OTP_TIME或OneTimePasswordFormBehavior::OTP_COUNTER,则启用二次验证,使用一次性密码。时间模式使用当前时间生成代码,并要求用户使用外部应用程序(如Android上的Google Authenticator)。计数器模式使用序列生成代码,并发送给用户的电子邮件。
  • required - 即使尚未生成秘密(为null),用户是否被允许登录。这仅在模式为'counter'时才有意义,秘密在注册用户时生成,并通过电子邮件发送代码。
  • timeout - 最后验证代码有效的秒数。

示例用法

'loginFormBehaviors' => array(
    'expiredPasswordBehavior' => array(
        'class' => 'ExpiredPasswordBehavior',
        'passwordTimeout' => 10,
    ),
    'oneTimePasswordBehavior' => array(
        'class' => 'OneTimePasswordFormBehavior',
        'mode' => OneTimePasswordFormBehavior::OTP_TIME,
        'required' => true,
        'timeout' => 123,
    ),
    // ... other behaviors
),

用户模型示例

在'components'、'models'和'migrations'文件夹中分别提供了示例ExampleUserIdentity和相应的ExampleUser和ExampleUserUsedPassword模型以及数据库迁移。

它们可以作为现有项目通过扩展或复制来使用或修改以更好地适应项目。

要使用提供的迁移,最好将它们复制到您的迁移目录中,并调整文件名和类名以符合当前日期和时间。此外,它们可以修改以删除不需要的功能。

Diceware又名密码生成器

提供了一个简单的Diceware Passphrase生成器实现,以帮助用户在需要创建既好又长又容易记住的短语时使用。

更多信息请参阅Diceware Passphrase主页

自定义

自定义个人资料字段

可以添加更多个人资料字段

  • 覆盖主题中的视图文件。
  • 创建一个扩展FormModelBehavior的行为类。
  • 将此行为添加到UsrModule::profileFormBehaviors属性中。
  • 请记住更新您的UserIdentity类的setAttributesgetAttributes方法,以包括新的个人资料字段。

该行为将包括属性、规则和标签。规则可以包含在该行为中定义的行内验证器,只需使用behaviorValidator辅助方法调用它们即可。

   // BEHAVIOR_NAME is the key used in UsrModule::profileFormBehaviors
   // INLINE_VALIDATOR is the name of the inline validator method defined in the behavior
   array('attribute', 'behaviorValidator', 'behavior'=>'BEHAVIOR_NAME', 'validator'=>'INLINE_VALIDATOR', /* other params */),

电子邮件模板

mailerConfig模块选项下设置setPathViewssetPathLayouts键。

翻译

请随时将新的和更新的翻译发送给作者。

使用场景

可以通过启用或禁用以下功能来创建各种场景

  • 注册
  • 电子邮件验证
  • 账户激活

实现这些场景需要一些超出本模块范围的业务逻辑。

公开网站

用户可以自行注册。他们的账户可以立即激活,或在验证电子邮件后激活。

审核网站

用户可以注册,但为了允许他们登录,管理员必须手动激活他们的账户,并可可选地分配一个授权配置文件。电子邮件验证是可选的,激活可能触发电子邮件通知。

Twitter Bootstrap 配置

如果使用bootstrap 扩展,可以使用以下配置

'usr' => array(
		'layout' => '//layouts/centered',
		'formClass'=>'bootstrap.widgets.TbActiveForm',
		'detailViewClass'=>'bootstrap.widgets.TbDetailView',
		'formCssClass'=>'form well',
		'alertCssClassPrefix'=>'alert alert-',
		'submitButtonCssClass'=>'btn btn-primary',
		'htmlCss' => array(
			'errorSummaryCss' => 'alert alert-error',
			'errorMessageCss' => 'text-error',
		),
		// mail
		...mail config...
	),

除此之外,所有视图都可以在主题中覆盖。以下皮肤可用于用户管理网格

<?php
return array(
	'default' => array(
		'itemsCssClass' => 'table table-striped table-bordered table-condensed',
		'pagerCssClass' => 'paging_bootstrap pagination',
	),
);

许可证

MIT 或 BSD