[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]用户登陆中间件的主要内容,如果未能解决你的问题,请参考以下文章

PHP必用代码片段

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

Django中间件进行用户登陆验证

laravel5.4 关于执行删除管理员时候被删用户如果当时是登陆状态还可以操作的处理

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

如何统计网站在线人数?