[PHP]用户登陆中间件
Posted 李留广
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PHP]用户登陆中间件相关的知识,希望对你有一定的参考价值。
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]用户登陆中间件的主要内容,如果未能解决你的问题,请参考以下文章
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段