【问题标题】:Check if any middleware grant access in laravel检查是否有任何中间件在 laravel 中授予访问权限
【发布时间】:2020-11-23 08:17:46
【问题描述】:

我有两种类型的用户角色。管理员和经理。管理员可以访问所有路由,但管理员只能访问其中的一些。我的大部分路线都是资源路线。目前我有这个管理员路由组:

Route::middleware(['auth', 'admin'])->prefix('admin')->group(function () {
    Route::resource('post','PostController')
}

如果您需要检查,这是我的“管理员”中间件:

if (!Auth::user()->isAdmin())
    {
        return redirect('/home');
    }
    return $next($request);

在这里,管理员可以访问所有路线。但我想允许经理访问某些路线,例如post.index, post.show, post.edit。 我现在该怎么办?

下面我用例子详细解释我的问题

我有三个中间件,auth, manager, admin。顾名思义,auth 中间件检查用户是否经过身份验证,manager 中间件检查用户是否为经理,当然admin 中间件检查用户是否为管理员。 现在,对于Route::resource('post','PostController') 路由,

  • auth 可以访问 post.index, post.view
  • manager 可以访问 post.index, post.view, post.edit
  • admin 可以访问所有路由。 应用中间件解决问题的最佳方法是什么?

【问题讨论】:

  • 定义路由组并分配特定于这些组的中间件。如果想要更多地控制访问级别,请使用 ACL。
  • 所有路由都有前缀admin。如果您授予某些admin 路由的管理器访问权限,则至少应相应修改 URL。

标签: php laravel middleware laravel-middleware


【解决方案1】:

Laravel 允许在你的控制器中使用多个路由

按照以下步骤操作:

从您的路由组中删除 'admin' 中间件,只留下 'auth'

    Route::middleware(['auth'])->prefix('admin')->group(function()
    {
        Route::resource('post','PostController');
    }

现在,在您的 'manager.php' 路由文件中,您可以使用并指向相同的 PostController

Route::middleware(['auth'])->prefix('manager')->group(function()
{
    Route::resource('post','PostController');
}

然后像这样在PostController的顶部添加一个__construct()方法

class PostController extends Controller
{
    public function __construct()
    {
        $this->middleware('admin')->except(['index', 'show', 'edit']);
        $this->middleware('manager');
    }
}

【讨论】:

  • 我没有 manager.php 文件。我应该有一个吗?如果用户是管理员或经理,我有一个用户模型,我在其中指定了角色属性。
  • @Yeasir Arafat Hridoy - Laravel 还支持拥有多个路由文件,这就是为什么我假设您不仅将 web.php 文件用于所有路由。但是,如果您只为所有路由使用 web.php 文件,您仍然可以在其中添加路由。还是一样....如果对您有帮助,请不要忘记将我的答案标记为有效答案。
【解决方案2】:

您可以定义部分资源路由

https://laravel.com/docs/7.x/controllers#restful-partial-resource-routes

因此,您可以在中间件组中定义其中的一些,而在中间件组之外定义其他的。

Route::middleware(['auth'])->group(function(){
 Route::middleware(['admin'])->prefix('admin')->group(function () {
    Route::resource('post','PostController')->except([
    'index', 'show', 'edit'
     ]);
 }
 Route::middleware(['manager'])->prefix('manager')->group(function () {
  Route::resource('post','PostController')->only([
    'index', 'show', 'edit'
  ]);
 }
}

【讨论】:

  • 这看起来不正确,因为管理员和经理都可以访问它。
  • @vivek_23,index、show 和 edit 应该都可以访问,其他的都在管理中间件中,那么哪里出错了?
  • 我需要另一个用于管理器的中间件来检查用户是否是管理器。没有manager 中间件。
  • @Aless55 假设我是一名员工,既不是经理也不是管理员。然后呢?
  • @vivek_23 我编辑了我的答案,现在它应该考虑到这一点,它还取决于经理中间件正在检查什么,但现在它应该与 4 票赞成的答案相同
猜你喜欢
  • 2016-03-14
  • 2013-05-17
  • 1970-01-01
  • 2020-01-31
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
相关资源
最近更新 更多