开启全局中间件,判断用户是否登陆。只有登陆的路由不使用该中间件验证。如何解决?

需求描述:

框架开启全局中间件,用以判断用户是否登陆.
如果用户没有登陆,跳转至登陆的路由。如果用户登陆,则通过判断用户会员到期时间,判断会员时间是否到期,如果到期则修改用户状态。

当开启了全局中间件时,登陆路由也无法使用。有什么方法可以除登陆路由外,其他路由正常走全局中间件的验证呢?

当前代码及遇到的问题

当开启全局中间件时,登陆的路由会陷入全局中间件的死循环。

check中间件

 <?php

declare (strict_types = 1);

namespace app\middleware;

class check

{

/**

* 处理请求

*

* @param \think\Request $request

* @param \Closure $next

* @return Response

*/

public function handle($request, \Closure $next)

{

//

// 判断用户是否到期,如果该用户到期,则修改用户会员信息。返回用户不是会员的信息

// if ($request->param('username')) {

// return redirect('index/think');

// }

// 获取用户session 获取当前时间

$username = session('username');

if (empty($username)) {

return redirect('check/check');

}

// $now = date('Y-m-d h:i:s', time());

// return $next($request);

}

}

定义全局中间件

<?php

// 全局中间件定义文件

return [

// 全局请求缓存

// \think\middleware\CheckRequestCache::class,

// 多语言加载

// \think\middleware\LoadLangPack::class,

// Session初始化

\think\middleware\SessionInit::class,

//开启全局中间件

\app\middleware\check::class,

];

开启全局中间件,判断用户是否登陆。只有登陆的路由不使用该中间件验证。如何解决?

回答

两种解决办法:

  1. 在check中间件里添加例外路由规则。
  2. 不要声明为全局中间件,注册为路由中间件,手动在路由配置里用middleware方法指定路由。比如 Admin 命名空间下所有路由需要登录,可以用 Route::namespace('Admin')->middleware('check') 统一指定。

已解决
在check中间件里添加路由规则。
下面将代码粘贴进来,如果看到代码有觉得可以优化的地方还请不吝赐教!
<?php
declare (strict_types = 1);

namespace app\middleware;

class check
{

const IGNORE = [

'/check/check',

'/check/login',

];

/**

* 处理请求

*

* @param \think\Request $request

* @param \Closure $next

* @return Response

*/

public function handle($request, \Closure $next)

{

//

if (in_array($request->get('s'),self::IGNORE)) {

return $next($request);

}

$username = session('username');

if (empty($username)) {

return redirect('/check/check');

}

return $next($request);

}

}

以上是 开启全局中间件,判断用户是否登陆。只有登陆的路由不使用该中间件验证。如何解决? 的全部内容, 来源链接: utcz.com/a/80739.html

回到顶部