分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 网页技术

[PHP]用户登陆中间件

发布时间:2023-09-06 02:14责任编辑:蔡小小关键词:PHP

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

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

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


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

app\models\Login.php

<?phpnamespace 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

<?phpnamespace 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

<?phpnamespace 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]用户登陆中间件

原文地址:https://www.cnblogs.com/liliuguang/p/9618317.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved