書かれている方法でももちろん良いと思います。
Sentryなどを使わなくてもLaravelらしい方法で実装する事が出来ます。
テーブルが3つそれぞれ全く別なものとして扱うのであれば、
権限に合わせたドライバーを3つ用意するとそれぞれの権限毎の独立した認証クラスが作れます。
それぞれのドライバーを用意したとして書きますが、
ログイン時にそれぞれのユーザーのロールが取得できるようであれば、
下記の様にそれぞれ専用の処理となります。
■attemptを使う場合
lang
1\Auth::driver('students')->attempt(['name', 'password']);
2\Auth::driver('teachers')->attempt(['email', 'password']);
■ログインサービス等のクラスを作ってそこでログインさせる場合等のサンプル
(クラス名などはお使いの実装に合わせてください)
lang
1namespace Application;
2
3use Illuminate\Auth\UserInterface;
4
5class AuthenticateService
6{
7
8 /** @var UserInterface */
9 protected $user;
10
11 /**
12 * @param UserInterface $user
13 */
14 public function __construct(UserInterface $user)
15 {
16 $this->user = $user;
17 }
18
19 public function login(array $attributes)
20 {
21 $user = $this->user->get($attributes);
22 return \Auth::driver($user->role)->login($user);
23 }
24}
後者の場合は、Auth::attempt()
を利用するより実装に合わせ易いと思います。
userモデルやリポジトリでユーザー情報とロールを取得して
authのloginメソッドでログインさせます。
loginメソッドで利用する$userは Illuminate\Auth\UserInterface を実装するだけです
上記のうちどれも認証フィルター等で'auth.students'や'auth.teachers'などを
用意するとデフォルトのauthを単純に増やすだけですとフィルターは下記の様になると思います。
(サービスプロバイダーに記述した例)
lang
1 $this->app['router']->filter('auth.students', function($router, $request) {
2 $auth = $this->app->auth;
3 if($auth->driver('students')->guest()) {
4 if($request->ajax()) {
5 return \Response::make('Unauthorized', 401);
6 }
7 return \Redirect::guest('login');
8 }
9 });
実装方法は他にもありますが、どんなテーブルでも自由に実装に利用できますので、
フレームワークのコードを読んでやり易い方法で実装してみて下さい。
ドライバー追加や、複数認証実装方法全て書いてしまうと長くなりますので、
当方のブログですがこの辺りの実装ヒントを書いてありますので参考になればと思います↓
複数の認証クラスを使うヒント
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/23 00:44