Laravel аутентифицирует пользователей, когда их школа активна - PullRequest
0 голосов
/ 25 сентября 2019

Мы делаем проект Laravel для школ.У нас есть база данных для школ, и в ней есть такие пользователи, как учителя, сотрудники и т. Д.Моя проблема заключается в том, как я могу запретить конкретному пользователю определенной школы входить в систему, где его статус школы отмечен = 0 или неактивен в нашей базе данных?

Таблица школ +--------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(191) | NO | UNI | NULL | | | description | text | NO | | NULL | | | logo | varchar(191) | YES | | NULL | | | status | int(11) | NO | | 1 | | | updated_by | varchar(191) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +--------------+------------------+------+-----+---------+----------------+

Таблица пользователей +-------------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(191) | NO | | NULL | | | email | varchar(191) | NO | UNI | NULL | | | password | varchar(191) | NO | | NULL | | | role | int(11) | NO | | 0 | | | school_id | int(11) | NO | | NULL | | | gender | int(11) | NO | | 1 | | | birthdate | date | YES | | NULL | | | address | varchar(191) | NO | | | | | phone | varchar(191) | YES | | NULL | | | remember_token | varchar(100) | YES | | NULL | | +-------------------+------------------+------+-----+---------+----------------+

LoginController.php

class LoginController extends Controller
{

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    // protected $redirectTo = '/admin';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        // $this->middleware('guest')->except('logout');
    }



}```

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

  public function schools()
    {
        return $this->belongsTo('App\School', 'school_id');
    }

Школьная модель

 public function users(){
        return $this->hasMany(User::class);
    }

Мой LoginController использует толькофункция AuthenticateUsers, и я не знаю, как ее переопределить или создать новую функцию для меня.Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 25 сентября 2019

использовать запрос на соединение.просто добавьте school_id в таблицу пользователей.например

self::where('users.school_id', $id)->where('schools.status',0)
1 голос
/ 25 сентября 2019

Вы можете переопределить функцию attemptLogin, чтобы также проверить это поле.

protected function attemptLogin(Request $request)
{
    //
    // Query the school status here and return false if status === 0.
    //

    return $this->guard()->attempt(
        $this->credentials($request), $request->filled('remember')
    );
}
1 голос
/ 25 сентября 2019

В LoginController вы можете переопределить метод authenticated, эта функция срабатывает, когда пользователь успешно вошел в систему.

public function authenticated(Request $request, $user)
{
    if ($user->schools()->status === 0) {
        Auth::logout($user);

        abort(403, 'Your school is not active.');
    }
}
  1. Я предполагаю, что вы настроили отношения, если нет, то просто выберите школу, в которую зачислен пользователь, и отметьте ее.
  2. Причина, по которой я предлагаю переопределить метод authenticated в отличие от других методов, заключается в том, что на данный момент вы знаете пользователяправильно вошел в систему, так что это правильное место для обработки, в отличие от attemptLogin.
1 голос
/ 25 сентября 2019

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

Подробнее об этом здесь: https://laravel.com/docs/master/middleware


Обновлено:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class Authenticate
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param \Illuminate\Contracts\Auth\Guard $auth
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->schools()->status == 0) {
            return response('School is inactive!', 401);
        }

        return $next($request);
    }
}

И добавьте вновь созданное промежуточное ПО в класс App \ Http Kernel.php .

Добавьте следующую строку в переменную $ routeMiddleWare :

'auth'                => \TIM\Http\Middleware\Authenticate::class,

Теперь последнее, что нужно сделать, это добавить 'auth' ключ к группе маршрутов .

Route::group([
    'middleware' => ['auth'],
], function () {
// your routes
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...