[PHP] - Laravel - 用戶登錄中間件

前言

Laravel 4中,可使用Route::filter,而在Laravel 5中,沒有了filter.php文件,官方建議使用中間件作。php

下面是用戶登錄的測試例子,涉及到的一些方法和使用,先參見這裏:http://www.cnblogs.com/HD/p/4569858.htmlhtml

這裏的例子是基於如上文章後所擴展的。chrome


 

 

1、新建一個用戶登錄模型

app\models\Login.phpjson

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

?>

 

2、新建中間件

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接口。cookie

另外,必需引用Closure,否則會出錯的。app

 

3、路由設置

新加入用戶登錄路由dom

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。post

 

4、登錄控制器

新建一個登錄控制器

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

?>

 

5、登錄視圖

新建一個登錄視圖

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,修改成你本身的密碼。密碼長度爲:1六、2四、32個字符。


 

測試驗證

訪問登錄頁面

 

登錄成功後能夠在chrome查看cookie值

 

未登錄訪問/my2,會跳轉到登錄頁面

 

用戶登錄失敗

相關文章
相關標籤/搜索