2016-11-05 133 views
3

我使用entrust來管理Laravel 5.3中的基於角色的權限,並自然地爲不同的用戶類型使用手動/自定義登錄。 Auth::attempt()有可能處理外部表關係嗎?基本上,我想要做這樣的事情:可以Laravel Auth :: attempt()處理關係嗎?

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'); 
}