【问题标题】:Middleware works on localhost but not on apache2 VM server中间件在 localhost 上工作,但在 apache2 VM 服务器上不工作
【发布时间】:2022-01-17 15:32:29
【问题描述】:

标题几乎概括了它。 我有一个 laravel 应用程序,我在我的笔记本电脑上开发并测试它何时在 127.0.0.1/8000 上运行 - 我刚刚为不同的用户(管理员、员工和门户用户)添加了中间件

当未登录并尝试访问管理路由 (127.0.0.1/8000/admin/reporting) 时,我成功被拒绝并重定向到主页。现在我将它推送到 GitHub 并在 ubuntu VM 上拉取,我仔细检查了这些更改。

但是当我访问服务器的 URL 时,我仍然可以访问所有页面而无需经过身份验证。

你们中有人遇到过类似的问题吗?我不确定我应该提供什么代码,所以请告诉我,我会将其添加到帖子中。

谢谢

编辑:中间件代码

protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::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,
        'admin' => \App\Http\Middleware\AdminMiddleware::class,
        'employee' => \App\Http\Middleware\EmployeeMiddleware::class,
        'portal' => \App\Http\Middleware\PortalMiddleware::class,
    ];

管理中间件:

 public function handle(Request $request, Closure $next)
    {
       if (!Auth::user() || Auth::user()->abteilung_name != 'Geschäftsführung') {
           return redirect('/')->with('redirect_error', 'Auf diese Seite haben Sie keinen Zugriff');
       }
        return $next($request);
    }

员工中间件:

 public function handle(Request $request, Closure $next)
    {
        if (!Auth::user() || !auth()->user()) {
            return redirect('/')->with('redirect_error', 'Auf diese Seite haben Sie keinen Zugriff');
        }
        return $next($request);
    }

门户中间件:

public function handle(Request $request, Closure $next)
    {

        if (!Auth::user() || !Auth::guard('portal')->user()) {
            return redirect('/')->with('redirect_error', 'Auf diese Seite haben Sie keinen Zugriff');
        }
        return $next($request);
    }

这是一个示例路由,所有其他看起来都差不多 - 只是最后的中间件因路由而异。

Route::get('/admin/reporting', [AdminController::class, 'getReportingView'])->name('reporting')->middleware('admin');

【问题讨论】:

  • 您可以提供中间件...您确定您当前没有经过身份验证吗?
  • @lagbox 可以,请稍等。我通过了身份验证,我注销了,删除了 cookie,关闭了浏览器,但它仍然有效
  • 这是在所有这些中间件中检查的同一用户Auth::user() 在每个中都是相同的警卫.. !Auth::user() || !auth()->user() 这是相同的检查两次
  • @lagbox 是的,它会检查某人是否经过身份验证,如果没有重定向到主页。管理员和员工保存在同一张表中,唯一的区别是他们工作的部门。那是abteilung_name
  • 天哪。我已经用过这个命令百万次了,但我现在没有想到。现在可以了,非常感谢!!!!!! :D 雅皮士。您想将其添加为答案吗?所以我可以接受它

标签: php laravel apache authentication middleware


【解决方案1】:

您的路线似乎已被缓存。由于这是在您的服务器(主机)上,您应该重新缓存路由:

php artisan route:cache

您应该将此作为部署过程的一部分,以及重新缓存配置 (php artisan config:cache)、运行 composer install、运行迁移 (php artisan migrate) 等。

如果这不是一个真正的实时站点,并且您仍在开发中,您也可能根本不缓存路由,那么您不需要在每次更改路由时重新缓存它们。您可以使用php artisan route:clear 清除缓存。这就是您在本地运行的方式,无需缓存路由。只需确保在部署实时站点时缓存路由是您流程的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多