Как получить идентификатор в Middleware, когда я использую user () - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть отношения между пользователями и ролями.В промежуточном программном обеспечении мне нужно получить роли, чтобы проверить, является ли роль 1 или 2. Однако я получаю следующую ошибку:

"Попытка получить свойство 'role_id' не-объекта."

Я уверен, что у меня есть идентификатор 1 в role_id.

Модель пользователя

public function role()
{
    return $this->belongsTo(Role::class, 'role_id');
}

public function handle($request, Closure $next)
{
    if (!Auth()->check() && $request->user()->role_id == 1) {
        return redirect()->back();
    }

    return $next($request);
}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

[Не могу комментировать, поэтому я пишу сообщение.]

Акен уже ответил вам, но я бы предложил еще одну вещь. Не используйте 1 или 2 в качестве идентификаторов, но константы:

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->role_id == ADMIN) {
        return $next($request);
    }

    return redirect()->back();
}

Вам даже не нужны комментарии для этого. Может быть, даже лучше:

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->isAdmin()) {
        return $next($request);
    }

    return redirect()->back();
}

но вам нужно реализовать это самостоятельно.

0 голосов
/ 14 апреля 2019

Логика вашего оператора if ошибочно проверяет, вошел ли пользователь в систему out , одновременно проверяя роли пользователя.Если Auth::check() равно false, то пользователь не вошел в систему и $request->user() вернет null.

Удаление ! из условия исправит полученную ошибку.

public function handle($request, Closure $next)
{
    if (Auth()->check() && $request->user()->role_id == 1) {
        return redirect()->back();
    }

    return $next($request);
}

Однако, это позволит всем гостям продолжить , чего вы, возможно, не захотите.Предполагая, что вы хотите, чтобы промежуточное программное обеспечение позволяло продолжить работу только зарегистрированным пользователям с определенной ролью, используйте подход из белого списка, подобный следующему:

public function handle($request, Closure $next)
{
    // Role ID 2 has permission to proceed
    if (Auth()->check() && $request->user()->role_id == 2) {
        return $next($request);
    }

    // Everyone else should go back, including logged-in users and guests.
    return redirect()->back();
}
...