【问题标题】:Laravel 8: Custom Middleware Does Not Seem To Be WorkingLaravel 8:自定义中间件似乎不起作用
【发布时间】:2021-07-24 17:06:24
【问题描述】:

我在我的项目中使用 Laravel 8,在这个项目中,我创建了一个名为 Admin 的自定义中间件,如下所示:

public function handle(Request $request, Closure $next)
{
    if (Auth::check()) {
        if (Auth::user()->isAdmin()) {
            return $next($request);
        }
    }

    return redirect('/');
}

我试着像这样应用它:

Route::group(['middleware' => 'admin'], function() {
    Route::resource('admin/users', App\Http\Controllers\Admin\AdminUserController::class);
});

Kernel.php:

'admin' => \App\Http\Middleware\Admin::class

所以我在用户模型中调用了isAdmin(),它只是检查用户的角色是否正确:

public function roles()
{
    return $this->belongsToMany(Role::class);
}

public function isAdmin()
{
    foreach ($this->roles as $role) {
        if ($role->name == 'Manual User') {
            return true;
        }
    }

    return false;
}

目前,我有这两个角色:

而我要登录的用户设置为 6 并且角色 ID 为 1 其中Manual User:

但现在的问题是,当我转到 /admin/users uri 时,它不会将我重定向到 ('/') uri 并显示/admin/users 页面!

那么这里出了什么问题?我该如何解决这个问题?

请注意,rolesusers 之间的关系是多对多,可以正常工作,无需提及它们。

【问题讨论】:

  • 从健全性检查开始。将dd('test') 作为handle 方法的第一行,看看它是否首先被调用。
  • @kmuenkel 我放了那个,但是当我转到/ uri 和/admin/users uri 时,屏幕上什么也没有。为什么会这样?
  • 不确定。在App\Http\Kernel 中,你的中间件在$routeMiddleware 数组中被引用,是吗?
  • 让我们再做一次检查。这将验证 Route 定义是否如您所想。有时动态路由会有点踩到你的脚趾,如果它们以错误的顺序定义,将路径节点误认为参数并发送到错误的控制器。在 AdminUserController 中,确保您正在试验的方法在 $request 对象中进行类型提示并添加:$route = $request->route(); dd(['path' => '('.$request->method().')'.urldecode($route->uri()), 'name' => $route->getName()]);

标签: php laravel middleware laravel-8 laravel-middleware


【解决方案1】:

我在本地尝试了一个非常相似的设置,没有问题。我冒昧地改变/简化了一些事情。

这些是我采取的步骤。

1。中间件

1.1.创建Admin 中间件。

通过运行php artisan make:middleware Admin 命令完成。

1.2.填写中间件。

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class Admin
{
    /**
     * Passes if authenticated user is an admin.
     *
     * @see App\Models\User::isAdmin()
     */
    public function handle(Request $request, Closure $next)
    {
        if (Auth::user()->isAdmin()) {
            return $next($request);
        }

        return redirect('/');
    }
}

这是我的第一个更改:我不使用Auth::check()。还有另一个中间件。

1.3 在App\Http\Kernel.php 中为$middlewareGroups 添加新条目。

    protected $middlewareGroups = [
        'web' => [...],

        'api' => [...],

        // check if user is authenticated, then check if it's an admin
        'admin' => [
            'auth',
            \App\Http\Middleware\Admin::class
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        ...
    ];

2。路线

添加使用上面创建的中间件的路由。

Route::middleware('admin')->group(function () {
    Route::get('test', function () { return "User is authenticated and is an admin."; });
});

此外,您还可以选择简化您的 isAdmin() 方法。

public function isAdmin()
{
    return $this->roles->contains('name', 'Manual User');
}

对我来说,这达到了预期的效果。您确定您正确编辑了App\Http\Kernel.php 文件吗?

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 2022-01-08
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多