前言

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

下面是用户登陆的测试例子,涉及到的一些方法和使用,先参见这里:http://www.cnblogs.com/HD/p/4569858.html

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


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

app\models\Login.php

<?php
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);
}
} ?>

二、新建中间件

app\Http\Middleware\CheckLoginMiddleware.php

<?php
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()]);
}
}
} ?>

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

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

三、路由设置

新加入用户登陆路由

app\Http\routes.php

//------------------------------------------------------------------
// Controller Group
// 加入前缀my2,意思是在里头的所有路由地址都以my2开头
// 例如:http://localhost/my/add
//------------------------------------------------------------------
Route::group(["prefix" => "my2", "middleware" => 'login'], function() {
Route::controller("/", "my\MyTest2Controller");
}); /**
* 控制器与路径设置
*/
Route::controllers([
// 用户登陆
'login' => 'LoginController',
]);

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

四、登陆控制器

新建一个登陆控制器

app\Http\Controllers\LoginController.php

<?php
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
]);
}
}
} ?>

五、登陆视图

新建一个登陆视图

resources\views\login.blade.php

<?php
?>
<font color="red">{{isset($errorMessage) ? $errorMessage : ""}}</font>
<form action="{{$path['postIndex']}}" method="post">
UserName:<input name="username" type="text" value="{{isset($login) ? $login->username : ''}}" />{!!isset($messages) ? $messages->first('username', '<span style="color:red;">:message</span>') : ""!!}<br/>
Password:<input name="password" type="password" />{!!isset($messages) ? $messages->first('password', '<span style="color:red;">:message</span>') : ""!!}<br/>
<input type="submit" value="Login" />
</form>

Cookie加密设置

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

打开:config\app.php

找到:

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

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


测试验证

访问登陆页面

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

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

用户登陆失败

[PHP] - Laravel - 用户登陆中间件的更多相关文章

  1. [PHP]用户登陆中间件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 第5章 搭建S3C6410开发板的测试环境

    1.使用Eboot擦除NandFlash的方法如下: 第一步:准备工作 用串口线或USB转串口线连接开发板和PC,并启动minicom 第二步:进入Eboot状态 打开OK6410开发板的电源开关,过 ...

  2. php大力力 [055节] 大力力阅读文章集锦

    php大力力 [055节] 效率低啊,效率低 啥也不说了,先把网页挨个保存一下,关闭网页窗口 从 2015-09-11 10:58 到 2015-09-11 12:38 共用了100分钟,整理最近几天 ...

  3. document与window的区别

    [window对象] 它是一个顶层对象,而不是另一个对象的属性,即浏览器的窗口. 属性 defaultStatus 缺省的状态条消息 document 当前显示的文档(该属性本身也是一个对象) fra ...

  4. UILabel加载HTML

    NSString *string1 = @"<font color = \"red\">什么情况</font><br/>"; ...

  5. 【视频演示】FireBase链接已有应用&实时数据库的配置与使用

    全程无编辑,一镜到底,一帧未减,带上犯傻的时间全部不到31分钟:Firebase链接与基础功能使用如此之简单,跟我一起动手,从零开始链接Firebase吧~注意: 输入声源为笔记本自带麦克风,所以风扇 ...

  6. MySQL 重装

    由于之前第一次装MySQL,默认的datadir在启动盘中,我想要将datadir移动到更大的存储盘中.无奈网上的各种文章的方法在我这里总是不work.我决定重新用homebrew来装一遍MySQL. ...

  7. C#编程语言与面向对象——委托

    委托(delegate)也可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,所定义的变量能接收的数值只能是个函数,更确切地说,委托类型的变量可以接收一个函数的地址. 简单地说 委托变 ...

  8. 3.Complementing a Strand of DNA

    Problem In DNA strings, symbols 'A' and 'T' are complements of each other, as are 'C' and 'G'. The r ...

  9. PHP连接MySQL数据库

    PHP连接MySQL数据库 既然现在你看到了这篇文章,说明你肯定知道PHP和MySQL是怎么一回事,我就不啰嗦了.但为什么你还要继续阅读此文呢?可能是以前你习惯复制粘贴一些代码,并没有真正弄懂代码的含 ...

  10. "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    [详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...