【问题标题】:Laravel same route for different middlewaresLaravel 不同中间件的相同路由
【发布时间】:2020-10-20 19:10:39
【问题描述】:

我对路由和中间件有疑问。我有 5 个中间件角色。 Administravimas, birstonas_biblioteka, druskininkai_biblioteka, birstonas_registratura,druskininkai_registratura。

问题是一些相同的路由可以访问多个角色。但是当我向不同的中间件声明相同的路由时,只有其中一个可以访问,当我使用或在具有多个中间件的路由中时,每个角色都可以访问路由。

中间件代码管理:

class Administravimas
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $userRoles = Auth::user()->roles()->pluck('pavadinimas');
        //$collection = DB::table('roles_users')->select('*')->get
        //dd($userRoles);
        if(!$userRoles->contains('Administravimas'))
        {
            return redirect('/prieiga-nesuteikta');
        }
        return $next($request);
    }
}

中间件代码 birstonas_registratura

public function handle($request, Closure $next)
{
    $userRoles = Auth::user()->roles()->pluck('pavadinimas');
    //$collection = DB::table('roles_users')->select('*')->get
    //dd($userRoles);
    if(!$userRoles->contains('Birštonas registratūra'))
    {
        return redirect('/prieiga-nesuteikta');
    }
    return $next($request);
}

网络路由:

Route::group(['middleware' => 'Administravimas' OR 'birstonas_registratura'], function () {
    Route::get('books', 'BookController@index')->name('books');
    Route::post('books', 'BookController@add')->name('book.add');
    
});

内核:

'Administravimas' => \App\Http\Middleware\Administravimas::class,
    'birstonas_biblioteka' => \App\Http\Middleware\BirstonasBiblioteka::class,
    'druskininkai_biblioteka' => \App\Http\Middleware\DruskininkaiBiblioteka::class,
    'birstonas_registratura' => \App\Http\Middleware\BirstonasRegistratura::class,

那么我如何只为某些群体而不是所有群体声明相同的路线。

【问题讨论】:

  • 或者我需要为同一个功能使用不同的路由?
  • 您制作了一个中间件,您可以将多个参数传递给您想要允许的不同角色,而不是只检查单个角色的多个中间件
  • 你能举一些例子来尝试这样做,但没有运气

标签: laravel routes middleware roles


【解决方案1】:

您可以将参数传递给中间件,因此您可以制作一个中间件,您可以传递您想要允许的所有角色的名称:

public function handle($request, $next, ...$roles)
{
    $userRoles = Auth::user()->roles()->pluck('pavadinimas');

    foreach ($roles as $role) {
        if ($userRoles->contains($role)) {
            // they have the current iterated role
            // let them pass through
            return $next($request);
        }
    }

    // they don't have any of these roles
    // redirect away
}

然后分配你的中间件:

`rolescheck:Admin,student`

使用您目前拥有的作为基础示例。

【讨论】:

  • 完成此操作,但仅适用于第二个获取访问被拒绝的第一个参数
  • 它会检查你传递的所有角色,它不会停止,除非它找到你拥有或根本没有它们的角色
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2013-09-24
  • 2016-03-29
  • 2018-01-13
  • 2021-05-29
  • 2020-06-18
  • 2017-04-05
  • 2016-10-03
相关资源
最近更新 更多