2017-01-29 6 views
0

Я немного новичок в Laravel, и у меня проблемы с аутентификацией пользователей, как я хочу. В настоящее время в моей базе данных есть таблица пользователей и таблица компаний.Laravel 5 - аутентифицировать против двух таблиц

Я видел множество примеров аутентификации с несколькими таблицами на основе ли пользователь является администратором или не используя gaurds, но я ищу для проверки подлинности всех пользователей следующим образом:

  1. пользователя email и password матч (поля в таблице пользователя)
  2. пользователя status в настоящее время активен (поле в таблице пользователей)
  3. Пользователь принадлежит компании с активным status (поле в таблице компаний)

ответ

0

С тех пор, как я опубликовал этот вопрос, я изучал как можно больше и, наконец, получил удовлетворительное решение. Я не уверен, что это самый чистый способ, но он работает для меня. Если кто-то может извлечь выгоду из этого, вот шаги, которые я взял:

1) Я добавил следующий код app\User.php модели:

# company/user relationship 
    public function company() { 
     return $this->belongsTo('App\Company', 'comp_id'); 
    } 

    # determine if company is active 
    public function activeCompany() { 
     $comp_stat = $this->company()->first(['status'])->toArray(); 

     return ($comp_stat >= 1) ? true : false; 
    } 

я модифицировал метод ручки в app\Http\Middleware\Authenticate.php со следующим:

public function handle($request, Closure $next, $guard = null) { 
     if (Auth::guard($guard)->guest()) { 
     if ($request->ajax() || $request->wantsJson()) { 
      return response('Unauthorized.', 401); 
     } else { 
      return redirect()->guest('login'); 
     } 
     } 

     /* begin modified section */ 

     if (Auth::check()) { 
     # logout if company is inactive 
     if (!auth()->user()->activeCompany()) { 
      Auth::logout(); 
      return redirect()->guest('login')->with('comp-status-error', true); 
     } 

     # logout if user is inactive 
     if (auth()->user()->status != 1) { 
      Auth::logout(); 
      return redirect()->guest('login')->with('user-status-error', true); 
     } 
     } 

     /* end modified section */ 

     return $next($request); 
    } 

Таким образом, технически пользователь уже проходит проверку подлинности перед проверкой состояния компании и пользователя, поэтому вы должны позвонить по телефону Auth::logout() вручную. Это также причина, по которой он чувствует себя немного «грязным» для меня, но опять же, я не мог понять другого пути, и поэтому мне пришлось делать то, что сработало! Я призываю всех комментировать, если они видят лучший способ добиться этого.

Смежные вопросы