2016-11-05 7 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); 
} 

あなたはユーザーロールのルートベースを変更したい場合は、あなたがしようとすることができます

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

で認証することができますこれは、私は、ログインコントローラを統合してしまう場合は特に、良い解決策です。しかし、単純化し、質問の文脈を維持するために提供された関数をインラインに保つために、私は別の解決策を作り、答えとしてマークしました。 –

0

私は手動で認証チェックを行い、012を使用しましたを使用して、認証されたセッションを作成します。この方法では、特定のログインポータルとコントローラの役割要件を満たしていれば、ユーザーはログインしていました。

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'); 
} 
関連する問題