【问题标题】:Laravel - How to OR among middlewares for a route?Laravel - 如何在中间件之间进行或路由?
【发布时间】:2026-01-19 12:30:01
【问题描述】:

我的网站中有一个表users,如果用户是管理员或他/她的帐户,则允许用户更新用户。我可以将此规则放在中间件中并将其强加在路由上,但我想在其中创建单独的中间件和OR。我可以这样做吗?

以下代码

Route::group(['middleware' => ['admin','Owner']],
    function () {
        Route::resource('roles', 'RoleController');
        Route::resource('locations', 'LocationController');
        Route::resource('recipients', 'RecipientController');
        Route::resource('classifications', 'ClassificationController');
    });

具有AND 行为。我认为可以使用web.phpUserController 中的一些if ... else ... 语句来做到这一点,但我需要知道是否还有其他出路。

提前致谢


更新

这里是 Owner 中间件

class OwnerMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $id)
    {
        if(Auth::guest())
            return abort(403, 'Access Denied');
        if(Auth::user()->id != $id)
            return abort(403, 'Access Denied');
        return $next($request);
    }
}

然后我将$id参数传递给它。

【问题讨论】:

标签: laravel laravel-5 routes laravel-middleware


【解决方案1】:

中间件真的没有“或”。它要么行动要么通过。您必须扩展当前的中间件以检查所有权或编辑权限。

但是,我建议使用带有中间件的策略来解决此问题: 见:https://laravel.com/docs/master/authorization#via-middleware

【讨论】: