php启动中间件,[PHP]用户登陆中间件

Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做。

这里的例子是基于如上文章后所扩展的。

一、新建一个用户登陆模型

app\models\Login.php

67d0865f17d9be527254bf8a8ff6c5b4.gif

namespace App\models;

use App\models\BaseModel;

/**

* 用户登陆模型

* @author Robin

*

*/

class Login extends BaseModel

{

/**

* 用户名

* @var String

*/

public $username;

/**

* 名称

* @var String

*/

public $password;

/**

* 转换用户输入为对象模型

* @param Input $input

*/

public function convert($input) {

//-----------------------------------------------------

// 字段验证

//-----------------------------------------------------

$rule = array(

"username" => "required|min:4|max:10",

"password" => "required|between:3,16",

);

//-----------------------------------------------------

// 调用父类方法

//-----------------------------------------------------

$this->init($input, $rule);

}

}

?>

67d0865f17d9be527254bf8a8ff6c5b4.gif

二、新建中间件

app\Http\Middleware\CheckLoginMiddleware.php

67d0865f17d9be527254bf8a8ff6c5b4.gif

namespace App\Http\Middleware;

use Closure;

use Cookie;

use Redirect;

use Illuminate\Contracts\Routing\Middleware;

/**

* 检查用户登陆中间件

* @author Robin

*

*/

class CheckLoginMiddleware implements Middleware

{

/**

* 构造函数

*/

public function __construct()

{

// TODO

}

/**

* Handle an incoming request.

*

* @param \Illuminate\Http\Request $request

* @param \Closure $next

* @return mixed

*/

public function handle($request, Closure $next)

{

// 取得用户的Cookie

$token = Cookie::get("TOKEN");

// 如果有Cookie

if(isset($token)) {

// 将cookie值转为json对象数组

$user = json_decode($token);

// 往下执行

return $next($request);

}

else {

// 如果取不到用户的cookie,跳转到用户登陆页面

return Redirect::action("LoginController@getIndex", ["path" => $request->fullUrl()]);

}

}

}

?>

67d0865f17d9be527254bf8a8ff6c5b4.gif

新建的中间建需要继承Middleware接口。

另外,必需引用Closure,不然会出错的。

三、路由设置

新加入用户登陆路由

app\Http\routes.php

67d0865f17d9be527254bf8a8ff6c5b4.gif

//------------------------------------------------------------------

// Controller Group

// 加入前缀my2,意思是在里头的所有路由地址都以my2开头

// 例如:http://localhost/my/add

//------------------------------------------------------------------

Route::group(["prefix" => "my2", "middleware" => 'login'], function() {

Route::controller("/", "my\MyTest2Controller");

});

/**

* 控制器与路径设置

*/

Route::controllers([

// 用户登陆

'login' => 'LoginController',

]);

67d0865f17d9be527254bf8a8ff6c5b4.gif

看到这里,在Route::group中加入了middleware。

四、登陆控制器

新建一个登陆控制器

app\Http\Controllers\LoginController.php

67d0865f17d9be527254bf8a8ff6c5b4.gif

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

use Redirect;

use Route;

use View;

use Input;

use Request;

use URL;

use Session;

use Response;

use Cookie;

use App\models\Login;

/**

* 用户登陆控制器

* @author Robin

*

*/

class LoginController extends BaseController

{

/**

* 设置路径

*/

private $path;

function __construct()

{

$this->path = [

"getIndex" => URL::action("LoginController@getIndex"),

"postIndex" => URL::action("LoginController@postIndex")

];

}

/**

* 登陆页面

*/

public function getIndex()

{

return View::make("login", [

"path" => $this->path

]);

}

/**

* 提交登陆

* @return \Illuminate\Http\RedirectResponse

*/

public function postIndex()

{

// new一个登陆页面的模型

$login = new Login();

// 转换用户输入为用户登陆模型对象

$login->convert(Input::All());

// 判断用户输入是否合法

if ($login->isValid()) {

// 判断用户名密码是否正确

if ($login->username == "admin" && $login->password == "admin") {

// 新增一个用户对象数组,用于输出到cookie

$user = [

"username" => $login->username

];

// cookie输出

Cookie::queue("TOKEN", json_encode($user), 3600);

// 页面跳转到另一个页面

return redirect()->action("my\MyTest2Controller@getIndex");

} else {

// 用户登陆抵账,返回view

return View::make("login", [

"login" => $login,

"errorMessage" => "User name or password error.",

"path" => $this->path

]);

}

} else {

// 用户输入不合法,返回view

return View::make("login", [

"login" => $login,

"messages" => $login->messages(),

"path" => $this->path

]);

}

}

}

?>

67d0865f17d9be527254bf8a8ff6c5b4.gif

五、登陆视图

新建一个登陆视图

resources\views\login.blade.php

67d0865f17d9be527254bf8a8ff6c5b4.gif

?>

{{isset($errorMessage) ? $errorMessage : ""}}

UserName:{!!isset($messages) ? $messages->first('username', ':message') : ""!!}

Password:{!!isset($messages) ? $messages->first('password', ':message') : ""!!}

67d0865f17d9be527254bf8a8ff6c5b4.gif

Cookie加密设置

Laravel自动已经为Cookie做了加密设置,需要修改加密密码,可以在这里修改:

打开:config\app.php

找到:

'key' => env('APP_KEY', 'SomeRandomString'),

默认密码为:SomeRandomString,修改为你自己的密码。密码长度为:16、24、32个字符。

测试验证

访问登陆页面

0706564af08765c002f7dd75c58440fb.png

登陆成功后可以在chrome查看cookie值

d225da1cffa13230d740db8bcfef589b.png

未登陆访问/my2,会跳转到登陆页面

43aee387971b4b6c07f9f0aa02feac9e.png

用户登陆失败

be8b178af02ca05f5960b12b378a0716.png

[PHP] - Laravel - 用户登陆中间件

前言 Laravel 4中,可以使用Route::filter,而在Laravel 5中,没有了filter.php文件,官方建议使用中间件做. 下面是用户登陆的测试例子,涉及到的一些方法和使用,先参 ...

基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

Django中间件 及 form 实现用户登陆

Django中间件 及 form 实现用户登陆 Form 验证 密码调用md5 加密存储 form.add_error("字段名", "错误信息") 自定义错误 ...

单用户登陆demo-后者挤到前者,类似QQ

单用户登陆demo ,采用的是Tp5. 流程是,当用户首次登陆是验证用户帐号密码,成功的,用当前时间戳加上用户id和ip 拼接成一个标识,暂且sign ,然后存入cookie ,时间戳存入缓存redi ...

五.数据库同步,创建django用户,用户登陆过程

(1)配置数据库 项目目录/settings.py是一个普通的python模块,每项配置都是一key/value 数据库的配置是以dict的形式存放在这个模块中,key名为:DATABASES DAT ...

IOS开发之记录用户登陆状态

上一篇博客中提到了用CoreData来进行数据的持久化,CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登 ...

使用Struts框架,实现用户登陆功能

前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...

Linux常用命令学习4---(挂载命令mount umount、用户登陆查看和用户交互命令 w who last lastlog)

紧接着上一篇Linux的命令行的学习:Linux学习3---(文件的压缩和解压缩命令zip unzip tar.关机和重启命令shutdown reboot……) 1.挂载命令     简介      ...

[转]mvc3 使用session来存储类来存储用户登陆信息

mvc3 使用session来存储类来存储用户登陆信息 2013-08-26 09:48:56|  分类: NET开发 |举报 |字号 订阅   项目之前的登陆机制是这样的:用户登陆后初始化一个类,类 ...

随机推荐

leetcode-Excel Sheet Column Title

题目: 把数字转化为excel形式的字符表示.示例:1->A 2->B 3->C ... 26->Z 27->AA... 解题思路: 乍一看有点像进制转换题目,不过细想想 ...

数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)

控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

使用PowerDesigner创建表并导入到数据库

使用PowerDesigner创建表并导入到数据库 刚刚学习使用PowerDesigner进行数据库的创建,下面我就分享一下如何创建表并导入到数据库. 1.首先到网上下载一下PowerDesigner ...

JAVA数字想加并输出

Java课后作业博文 1.设计思想:JAVA里面的Scnner类可以将用户输入的各种字符转化为其他类型.例如 Scanner sc = new Scanner(System.in); int a =  ...

[置顶] 学习JDK源码:可进一步优化的代码

1.参数化类型的构造函数比较啰嗦 new HashMap>() 如果你调用参数化类的构造函数,那么很不幸,你必须要指定类型参数,即便上 ...

Python编码规范:IF中的多行条件

Python编码规范:IF中的多行条件 转载 2017年03月08日 09:40:45 http://blog.csdn.net/wsc449/article/details/60866700 有时我 ...

outline: none;

outline: none:用在去掉某个选中后显示的外边框,(追求细节) http://www.w3school.com.cn/cssref/pr_outline.asp

判断颜色信息-RGB2HSV

前言 项目车号识别过程中,车体有三种颜色黑车黑底白字.红车红底白字.绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断. MATL ...

javaBean与map类型相互转换

/** * 把Map键值对转化为javaBean对象 * * @param type * @param map * @return * @throws Exception */ private Obj ...

wait/waitpid函数与僵尸进程、fork 2 times

一.僵尸进程 当子进程退出的时候,内核会向父进程发送SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) 子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程, ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值