你可以在控制器或路由中以相同的方式使用中间件吗?

Posted

技术标签:

【中文标题】你可以在控制器或路由中以相同的方式使用中间件吗?【英文标题】:Can U use the middleware the same way in the controller or route? 【发布时间】:2020-10-28 06:03:31 【问题描述】:

我正在努力确保您不能只在顶部栏中键入 /admin。我在用户表中添加了一个名为admin 的列,它是0(普通用户)或1(管理员)。

在刀片页面中,我正在检查:

@if (Auth::check())
  @if (Auth::user()->admin == 1)
   <p>Hello Admin</p>
  @else
   <p>Hello standard user</p>
  @endif
@endif

我在问是否可以检查路线(类似的

Route::get('/home', 'HomeController@index')->name('home')->middleware('auth')-where('admin' 1); 

或在控制器中(类似的东西

public function __construct()

   $this->middleware('auth')->where('admin' 1);

【问题讨论】:

【参考方案1】:

您可以使用新的中间件来实现这一点。

首先通过在控制台中输入来创建一个新的中间件:

php artisan make:middleware isAdmin

为你的中间件命名你喜欢的名字,isAdmin 在这里很常见。

接下来,您必须将中间件添加到位于 app/Http/Kernel.php 的 Kernel.php,编辑名为 $routeMiddleware 的数组并添加以下内容:

'isAdmin' =&gt; \App\Http\Middleware\IsAdmin::class,

打开位于中间件文件夹中的 IsAdmin.php 并修改句柄方法,如下所示:


     if (Auth::user() &&  Auth::user()->admin == 1) 
            return $next($request);
     

    return redirect('/');

注意:中间件还会检查用户是否经过身份验证,因此可以代替 auth 用于管理路由,请记住修改返回以满足您的需要

最后,将中间件添加到您的路由中,有很多方法可以做到这一点。

如果您打算使用它而不是 auth 中间件,只需在您的路由文件 -&gt;middleware('isAdmin') 中将 auth 更改为 isAdmin 另一种选择是像这样修改您的路线文件
Route::group(['middleware => 'auth'], function () 
    Route::get('/home', 'HomeController@index')->name('home')->middleware('isAdmin');

所以你不需要将中间件应用于每条路由,这里有很多可能性https://laravel.com/docs/7.x/middleware#assigning-middleware-to-routes

【讨论】:

以上是关于你可以在控制器或路由中以相同的方式使用中间件吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 UITextView 中以编程方式选择文本吗?

小米路由器可以设置端口转发吗?

rabbitmq消费端加入精确控频。

可以在 gVim Editor 中以某种方式设置字母间距吗

如何在 C# 中以相同的方式随机化/洗牌两个数组

最常用的限流算法以及如何在http中间件中加入流控