2016-11-05 12 views
3

Я использую entrust для управления разрешениями на основе ролей в Laravel 5.3 и, естественно, с использованием ручных/пользовательских логинов для разных типов пользователей. Возможно ли для Auth::attempt() обработать внешние отношения таблицы? В принципе, я хочу сделать что-то вроде этого:Может ли Laravel Auth :: попытка() обрабатывать отношения?

if(Auth::attempt(['email' => $request->email, 'password' => $request->password, hasRole('teacher') => true])) { 
     return redirect()->intended('teacher/dashboard'); 
} 

Но я получаю сообщение об ошибке, что hasRole() является неопределенной функцией. Я включил use Zizaco\Entrust\Traits\EntrustUserTrait; и use EntrustUserTrait;, которые, как я думал, предоставят мне доступ к функции, но, видимо, нет.

Я ценю тот факт, что hasRole() - это метод для объектов пользователя, и во время проверки у меня нет объекта пользователя, но я не могу выполнить проверку роли после попытки, потому что тогда пользователь уже был зарегистрирован, и если роль была неправильной, мне нужно было бы их вывести, поскольку их учетные данные верны, но не для роли; который кажется медленным, а не прагматичным.

Как мне с этим справиться? Есть ли альтернатива Auth::attempt, которую я могу использовать, чтобы не входить в систему пользователя, но проверить, существует ли пользователь с указанным входом, а затем запустить проверку роли, а затем использовать другую функцию для запуска аутентифицированного сеанса?

Если полезен мой LoginController здесь:

<?php 

namespace App\Http\Controllers\Teacher; 

use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Auth; 
use Illuminate\Http\Request; 
use Validator; 
use Zizaco\Entrust\Traits\EntrustUserTrait; 

class LoginController extends Controller { 
    use EntrustUserTrait; 

    public function showLoginForm() { 
     return view('teacher/login'); 
    } 

    public function authenticate(Request $request) { 
     Validator::make($request->all(), [ 
      'email' => 'required|email', 
      'password' => 'required', 
     ])->validate(); 

     if(Auth::attempt(['email' => $request->email, 'password' => $request->password, hasRole('teacher') => true])) { 
      return redirect()->intended('teacher/dashboard'); 
     } 

     return redirect('admin/login')->with('invalid', 'Invalid username or password'); 
    } 
} 

Любая помощь или направление будет высоко ценится. Благодарю.

ответ

1

, что вы можете сделать, это:

if(Auth::attempt(['email' => $request->email, 'password' => $request->password)) { 
    if($user = Auth::user()->hasRole('teacher')) { 
     return redirect()->intended('teacher/dashboard'); 
    } else { 
     return redirect()->intended('teacher/dashboard'); 
    } 
} 
+0

Это будет регистрировать кого-то, кто не обязательно учитель, но может пройти проверку подлинности на другой логин портала –

1

так это то, что я сделал на проверки роли входа

$user = User::whereEmail($request->email)->first(); 

// I added this is because the customer 
// are not suppose to login from here 
if(!$user || $user->hasRole(['customer'])){ 
    return $this->sendFailedLoginResponse($request); 
} 

if ($this->guard()->attempt($credentials, $request->has('remember'))) { 
    return $this->sendLoginResponse($request); 
} 

затем, если вы хотите, чтобы изменить маршрут базы на роли пользователя вы можете попытаться замените метод redirectPath просто

public function redirectPath() 
{ 
    $user = Auth::user(); 
    if($user->hasRole(['admin', 'system_admin'])) 
     return '/backend'; 
    elseif($user->hasRole(['teacher'])) 
     return '/teacher'; 
} 
+0

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

0

Я закончил вручную проверку подлинности и используя Auth::login($user), чтобы создать аутентифицированный сеанс. Таким образом, пользователь был зарегистрирован только в том случае, если они выполнили требования к роли для конкретного портала входа и контроллера.

public function authenticate(Request $request) { 
    Validator::make($request->all(), [ 
     'email' => 'required|email', 
     'password' => 'required', 
    ])->validate(); 

    $user = User::where('email', $request->email)->first(); 

    if($user) { 
     if(Hash::check($request->password, $user->password) && $user->hasRole('teacher')) { 
      Auth::login($user); 
      return redirect()->intended('teacher/dashboard'); 
     } 
    } 

    return redirect('teacher/login')->with('invalid', 'Invalid username or password'); 
}