yii2 的登录注册 轮子
//利用到了yii2 框架之中的验证规则 进行判定而已 也不是很高深的东西 但是 使用框架自身的轮子 会有安全性能的隐患
1注册reg controller 中 我都以admin 为例子
public function actionAdd()
{
$model = new Admin();
if (Yii::$app->request->isPost) {
$post = Yii::$app->request->post();
if ($re=($model->reg($post))) {
Yii::$app->session->setFlash('info','添加成功');
return $this->refresh();
}
Yii::$app->session->setFlash('info','添加失败');
}
return $this->render('add',['model'=>$model]);
}
2.1 model
public function reg($data)
{
$this->scenario = 'adminadd';
if ($this->load($data) && $this->validate()) {
$this->adminpass = Yii::$app->getSecurity()->generatePasswordHash($this->adminpass); //这儿使用到了yii框架的hash 密码 获取的时候使用validatepassword 验证
$this->createtime = time();
if ($this->save(false)) {
return true;
}
return false;
}
return false;
}
2.2 model 中的rules 验证规则
public function rules()
{
return [
['adminuser', 'required', 'message' => '管理员账号不能为空', 'on' => ['login', 'seekpass', 'changepass', 'adminadd', 'changeemail']],
['adminpass', 'required', 'message' => '管理员密码不能为空', 'on' => ['login', 'changepass', 'adminadd', 'changeemail']],
['rememberMe', 'boolean', 'on' => 'login'],
['adminpass', 'validatePass', 'on' => ['login', 'changeemail']],
['adminpass', 'validatePassword', 'on' => ['login']],
['adminemail', 'required', 'message' => '电子邮箱不能为空', 'on' => ['seekpass', 'adminadd', 'changeemail']],
['adminemail', 'email', 'message' => '电子邮箱格式不正确', 'on' => ['seekpass', 'adminadd', 'changeemail']],
['adminemail', 'unique', 'message' => '电子邮箱已被注册', 'on' => ['adminadd', 'changeemail']],
['adminuser', 'unique', 'message' => '管理员已被注册', 'on' => 'adminadd'],
['adminemail', 'validateEmail', 'on' => 'seekpass'],
['repass', 'required', 'message' => '确认密码不能为空', 'on' => ['changepass', 'adminadd']],
['repass', 'compare', 'compareAttribute' => 'adminpass', 'message' => '两次密码输入不一致', 'on' => ['changepass', 'adminadd']],
];
}
3 view 页面的展示 这个不重要
<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
$this->title = '注册'; ?>
<!-- main container --> <div class="container-fluid">
<div id="pad-wrapper" class="new-user">
<div class="row-fluid header">
<h3>注册员工</h3>
</div> <div class="row-fluid form-wrapper">
<!-- left column -->
<div class="span9 with-sidebar">
<div class="container">
<?php
if (Yii::$app->session->hasFlash('info')) {
echo Yii::$app->session->getFlash('info');
}
$form = ActiveForm::begin([
'options' => ['class' => 'new_user_form inline-input'],
'fieldConfig' => [
'template' => '<div class="span12 field-box">{label}{input}</div>{error}'
],
]);
?>
<?php echo $form->field($model, 'adminuser')->textInput(['class' => 'span9']); ?>
<?php echo $form->field($model, 'adminemail')->textInput(['class' => 'span9']); ?>
<?php echo $form->field($model, 'adminpass')->passwordInput(['class' => 'span9']); ?>
<?php echo $form->field($model, 'repass')->passwordInput(['class' => 'span9']); ?>
<div class="span11 field-box actions">
<?php echo Html::submitButton('创建', ['class' => 'btn-glow primary']); ?>
<span>或者</span>
<?php echo Html::resetButton('取消', ['class' => 'reset']); ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
<!-- side right column -->
<div class="span3 form-sidebar pull-right">
<div class="alert alert-info hidden-tablet">
<i class="icon-lightbulb pull-left"></i>
请在左侧填写员工相关信息,包括员工账号,电子邮箱,以及密码
</div>
</div>
</div>
</div>
</div>
</div>
<!-- end main container -->
/-----------------------以上就是简单的注册功能-----------------------------------------------------------------
// 登陆功能 login
controller 中
public function actionLogin()
{ $this->layout =false;
$model = new Admin();
//登录操作
if (Yii::$app->request->isPost) {
//获得数据信息
$post = Yii::$app->request->post();
if ($model->login($post)) {
$this->redirect(['default/index']);
Yii::$app->end();
}
}
return $this->render('login',['model'=>$model]);
}
model
注意查看我上面的验证规则 一点要看清楚 我自定义了两个验证规则 验证用户是否存在 和密码 不匹配的这两种情况
自定义验证1
public function validatePass()
{
if (!$this->hasErrors()) {
$data = self::find()->where('adminuser = :user', [":user" => $this->adminuser])->one(); if (is_null($data)) {
$this->addError("adminpass", "用户或密码错误");
return false;
}
if (!Yii::$app->getSecurity()->validatePassword($this->adminpass, $data->adminpass))
{
$this->addError("adminpass", "用户或密码错误");
}
}
}
自定义验证2
public function validatePassword(){
if (!$this->hasErrors()) {
$data = self::find()->where('adminuser = :user', [':user' => $this->adminuser])->one();
if (is_null($data)) {
$this->addError('adminpass','用户名不存在');
exit;
}
$data2 = self::find()->where('adminuser=:user and adminpass = :pass',[':user'=>$this->adminuser,':pass'=>$data->adminpass])->one();
if (is_null($data2)) {
$this->addError('adminpass','密码错误');
}
}
}
model中的login代码
public function login($data)
{
$this->scenario = "login";
if ($this->load($data) && $this->validate()) {
$lifetime = $this->rememberMe ? 24*3600 : 0;
$session = Yii::$app->session;
session_set_cookie_params($lifetime);
$session['admin'] = [
'adminuser' => $this->adminuser,
'isLogin' => 1,
];
$this->updateAll(['logintime' => time(), 'loginip' => ip2long(Yii::$app->request->userIP)], 'adminuser = :user', [':user' => $this->adminuser]);
return (bool)$session['admin']['isLogin'];
}
return false;
}
login view 这个随便大家在网上找就可以了我随便提供一个
<body class="login-bg">
<?php $this->beginBody(); ?> <div class="row-fluid login-wrapper">
<a class="brand" href="<?php echo yii\helpers\Url::to(['/index/index']) ?>"></a>
<?php $form = ActiveForm::begin([
'fieldConfig' => [
'template' => '{error}{input}',
],
]); ?>
<div class="span4 box">
<div class="content-wrap">
<h6>小涛商城 - 后台管理</h6>
<?php echo $form->field($model, 'adminuser')->textInput(["class" => "span12", "placeholder" => "管理员账号"]); ?>
<?php echo $form->field($model, 'adminpass')->passwordInput(["class" => "span12", "placeholder" => "管理员密码"]); ?>
<a href="<?php echo yii\helpers\Url::to(['public/seekpassword']); ?>" class="forgot">忘记密码?</a>
<?php echo $form->field($model, 'rememberMe')->checkbox([
'id' => 'remember-me',
'template' => '<div class="remember">{input}<label for="remember-me">记住我</label></div>',
]); ?>
<?php echo Html::submitButton('登录', ["class" => "btn-glow primary login"]); ?>
</div>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
$js = <<<JS
$(function () {
// bg switcher
var \$btns = $(".bg-switch .bg");
\$btns.click(function (e) {
e.preventDefault();
\$btns.removeClass("active");
$(this).addClass("active");
var bg = $(this).data("img"); $("html").css("background-image", "url('img/bgs/" + bg + "')");
}); });
JS;
$this->registerJs($js);
?>
<?php $this->endBody(); ?>
</body>
yii2 的登录注册 轮子的更多相关文章
- Yii2 用户登录
在Yii2的basic版本中默认是从一个数组验证用户名和密码,如何改为从数据表中查询验证呢?且数据库的密码要为哈希加密密码验证? 下面我们就一步一步解析Yii2的登录过程. 一. 创建user表模型 ...
- web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)
这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...
- android安卓Sqlite数据库实现用户登录注册
看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...
- JQuery+Ajax+Struts2+Hibernate 实现完整的登录注册
写在最前: 下午有招聘会,不想去,总觉得没有准备好,而且都是一些不对口的公司,可是又静不下心来,就来写个博客. 最近在仿造一个书城的网站:http://www.yousuu.com ,UI直接拿来用, ...
- HTML登录注册界面怎么制作?
在没有学习CSS样式的前提下,是如何做一个简单的注册界面的. 一.表单标签(form) 首先我们先写一个<form></form>的标签,form标签属于表单标签,通常我们的登 ...
- php+ajax 登录注册页面
主要是登录注册功能,前端后台验证没有什么,这个大家可以自己加上去,比如过滤啊,正则啊等 还是先放图吧 这是登录及注册界面 点击注册切换到注册界面,点击登录切换到登录界面 <!DOCTYPE h ...
- 7. Swift 基于Xmpp和openfire实现一个简单的登录注册
1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...
- Nodejs学习总结 -Express 登录注册示例(二)
项目创建后,我们来做个登录注册实例,详细操作步骤如下. 1.新建项目demo ,具体操作步骤参考上一章内容 https://www.cnblogs.com/Anlycp/ 2.添加mysql和sess ...
- iOS开发一个用户登录注册模块需要解决的坑
最近和另外一位同事负责公司登录和用户中心模块的开发工作,开发周期计划两周,减去和产品和接口的协调时间,再减去由于原型图和接口的问题,导致强迫症纠结症状高发,情绪不稳定耗费的时间,能在两周基本完成也算是 ...
随机推荐
- git分支合并冲突
合并冲突 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们. 如果你对 #53 问题的修改和有关 hotfix 的修改都涉及到同一个文件的同一处,在合并 ...
- MVC在页面View上获取当前控制器名称、Action名称以及路由参数
有时候在封装MVC通用控件时需要在页面上获取这些数据. 用以下方法即可: //获取控制器名称: ViewContext.RouteData.Values["controller"] ...
- 封装WebService的APM为Async、Await模式利于Asp.Net页面调用
Wcf针对Async.Await指令直接可以返回Task<T>结果,但是老旧的系统中还是会有很多是在用Soap的Webservice.直接在Asp.Net页面调用APM方法确实比较麻烦,其 ...
- Spring Bean相互依赖问题
如果是通过get,set 注入就不会有问题 如果是通过构造函数注入,SPRING就会报循环引用注入出错 循环依赖——在采用构造器注入的方式配置bean时,很有可能会产生循环依赖的情况.比如说,一个类A ...
- C#开发短信的方法和简介(转)
http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=6337(来自) 自己收藏哈子
- Web前端开发规范(二)
3.HTML代码规范 .html文件必须存放在项目工程约定的目录中. .html文件的命名:以模块 + 功能的结合方式来命名,比如:newsList.html. 文档类型声明:HTML4中使用< ...
- selenium产生的垃圾文件清理
C:\Users\XXXX\AppData\Local\Temp\anonymous7822503.webdriver-profile. 这个地址就是我的本地临时文件夹中seleniumdriver的 ...
- 新版mysql 5.7的group_by非常不和谐
sqlalchemy.exc.OperationalError OperationalError: (_mysql_exceptions.OperationalError) (1055, " ...
- 日志滚动与cron调度
日志滚动与cron调度 1.日志滚动 nginx默认日志不能进行滚动,始终写入到一个文件中,即access.log.编写日志滚动的shell脚本,并使用linux的cron定时调度周期性进行日志文件滚 ...
- JavaScript 面向对象编程(三):非构造函数对象的继承
JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...