Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

angelina-ss's avatar

middleware to check role_id not working

hello i want to give access to my resource routes to 2 roles (using their relationship user()->roleweb->role_id): // role_id = 1, 2, 3, 4 and i have a multiple middleware to group my routes:

Route::middleware(['data.manager', 'data.entry'])->group(function () {
    Route::resource('/dashboard/kliens', DashboardKlienController::class);
        // Kontak Klien
        Route::resource('kliens.kontaks', KontakKlienController::class);
        // Kontak Lain Klien
        Route::resource('kliens.kontaklains', KontakLainKlienController::class);
});

and these are the middleware:

        'data.manager' => \App\Http\Middleware\IsDataManager::class,
        'data.entry' => \App\Http\Middleware\IsDataEntry::class,
class IsDataManager
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if(!auth()->check() || auth()->user()->role_id !== 2) {
            abort(403);
        }

        return $next($request);
    }
}
class IsDataEntry
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if(!auth()->check() || auth()->user()->role_id !== 3) {
            abort(403);
        }

        return $next($request);
    }
}

it seems not to be working and my 2 roles can't access the routes at all & redirected to 403. thank you in advance

0 likes
4 replies
sr57's avatar

@angelina-ss

middlewares apply in a row, like 'AND' and you want 'OR'

You should define only one, with the 2 roles

angelina-ss's avatar

@sr57 thank you, and instead of checking each role_id, can i do it like this?

if(!auth()->check() || auth()->user()->role_id !== 2 || auth()->user()->role_id !== 3) {
            abort(403);
        }

        return $next($request);
sr57's avatar
sr57
Best Answer
Level 39

@angelina-ss

To be tested , but I should write

if(!auth()->check() || (auth()->user()->role_id !== 2 && auth()->user()->role_id !== 3) ) {	
1 like
angelina-ss's avatar

@sr57 thank you so much it's working and now i have more understanding about middleware

Please or to participate in this conversation.