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

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

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

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

app\models\Login.php

042633879cfd59c4d6454ae875244abb.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);

}

}

?>

548f38db97ba7ee8dcc17fa9813fd039.gif

二、新建中间件

app\Http\Middleware\CheckLoginMiddleware.php

cc391417961bb9932a2c21553bbaa478.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()]);

}

}

}

?>

ce17080f40ee1e8f2eaa359e2f5fab24.gif

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

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

三、路由设置

新加入用户登陆路由

app\Http\routes.php

a2a66751077273912ac6ad5839252003.gif

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

// Controller Group

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

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

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

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

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

});

/**

* 控制器与路径设置

*/

Route::controllers([

// 用户登陆

'login' => 'LoginController',

]);

a584fe7890da63a8f364d92a1845af49.gif

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

四、登陆控制器

新建一个登陆控制器

app\Http\Controllers\LoginController.php

dba7cc361d0efac39430c334ef7beff1.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

]);

}

}

}

?>

e813183f05204218d2a9776708b2095a.gif

五、登陆视图

新建一个登陆视图

resources\views\login.blade.php

25b2d8d1feeb8a8155ec54f5a571c536.gif

?>

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

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

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

80ee897c1595fd7864abbc19cd7b8c9b.gif

Cookie加密设置

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

打开:config\app.php

找到:

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

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

测试验证

访问登陆页面

0bc505021a0fa46c25cbaad3a5fbe017.png

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

43638aeff92ba972b913cbe105b0a1f4.png

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

92d8103a6b74946f7e33a9b37808cba8.png

用户登陆失败

f8fd98896f70b5d2380b13050dd9084a.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值