php Laravel 中间件判断Session登录

记录下自己踩的坑:

在没采用laravel框架时,比较那手的还是tp类的,喜欢把判断登录一类的方法 放在基类继承 然后构造运行下这样的流程..........

但是却在laravel不太适用,经过考察下来的时候   session的类以及助手方法 是laravel框架自己创造的,基层运行 优先级应该是低于构造  导致构造拿不到 记录到file 的session,

那根据这点 我们只能移植到中间件来判断~一下上代码   中间件到底该怎么搞,  我的框架是7的  以此为例:

1:我们先在app/Http/Kernel.php  声明下我们的中间件~

我选择在routeMiddleware 里声明了一个 login_check的中间件  也就是登录验证, 同时我也确定了我在那个明明空间下创建Loginaa这个验证类, 好接下来 我们去创建文件!

<?php

 protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'login_check' =>  \App\Http\Middleware\Loginaa::class
    ];

2:我们在文件里用has判断了下是否存在session  uid里是否有值, 没值会给false   有值则会true, 这时就可以在不登录时把我们访问重定向到登录页这样  接下来看看我们路由方面怎么写的

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
class Loginaa
{

    public function handle($request, \Closure $next){
        if(session()->has('uid')==false){
             //如果不存在时 我们该处理的业务  存在时则不进行处理
            // return redirect("/")->send();
        }
        return $next($request);
    }
}

3:路由文件 写在了 默认的 routes目录下的web.php, 此时看到 我们代码先分了组,声明了下这个组 访问的是Home模块,

然后内分组 括起来了某些方法 指定要加载我们写的登录验证中间件

此时 业务已经明朗了,  在访问首页  feedBack 以及 ajax 必须要先经过我们的中间件,  登录那边就不需要括在我们中间件的范围内, 不然会早成死循环跳转

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/


//模板类
Route::group(['prefix' => '','namespace' => 'Home'], function (){
    Route::middleware('login_check')->group(function(){
        //list页面
        Route::any('/','IndexController@list');
        //反馈也
        Route::any('/feedBack','IndexController@feedBack');
        //提交保存
        Route::any('/ajaxSave','IndexController@ajaxSave');
    });
    //回跳登录
    Route::any('/saveRegisterMessage','LoginController@saveRegisterMessage');
    //导出全量csv
    //Route::any('/contentDataExport','LoginController@contentDataExport');
});

4:我们声明了路由  最后看我下我们保存session的地方

这是我简单写了一个,我的场景是 微信环境下 封装的回跳机制下的,  可以忽略我的业务代码

最下面我们写入session  有时候啊 save一下 没有错的兄弟们, 在某些场景下(我忘记了),不save的话 session的东西不会落地,

导致你那边永远判断不到 但是你在set值的下面却打印的到,,就很诡异拉, 所以推荐下 set后就 save一下~

<?php

    //回跳登录 记录用户
     public function saveRegisterMessage(Request $request){
        $param = $request->input();
        //获取openid
        $openID = $request->input("OpenId");
        //查询该用户是否存在
        $user =  DB::table('user')->where(['openid'=>$openID])->first();
        $userData = array(
            "updated_at" => time(),
            "truename" => $request->input("Name"),
            "phone" => $request->input("Phone"),
            "province" => $request->input("Province"),
            "city" => $request->input("City"),
            "hospital" => $request->input("Hospital"),
            "department" => $request->input("Department"),
            "position" => $request->input("Title"),
        );
        if(empty($user)){
            //保存用户信息
            $userData["created_at"] = time();
            $userData["openid"] = $openID;
            $res = DB::table('user')->insertGetId($userData);
            if($res){
                $userID = $res;
            }else{
                return '注册失败';
            }   
        }else{
            $userID = $user->id;
        }
        session(['uid'=>$userID]);
        session()->save(); 
        return redirect("/");
    }

童鞋们 大概就是这个样子~主要还是流程,然后靠自己在手册 以及别人文章中检索自己有用的知识, 多动手实验~

猜你喜欢

转载自blog.csdn.net/weixin_42616063/article/details/114632348
今日推荐