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

发布于 2022-09-12 13:44:42 字数 1453 浏览 32 评论 0

需求描述:

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

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

当前代码及遇到的问题

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

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,
];

全局中间件判断用户是否登陆,只有登陆的时候不使用这个中间件验证。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

生活了然无味 2022-09-19 13:44:42

两种解决办法:

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

已解决
在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);
}

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文