ユーザー認証の目的は、ユーザー本人であることを確認し、ユーザーのプライベートの情報を他に見られることを防ぐことです。
Laravelでは、アプリにおけるすべてのルートを設定するroutes.phpのファイルにおいて、ミドルウェアを利用して保護するページを指定します。
Route::get('/home', ['middleware' => 'auth', function () {
return view('auth.home');
}]);
上の例では、/homeを保護するために、ミドルウェアのauthを使用しています。authは、以下のKernel.phpで登録されているサービスです。
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middleware = [
...
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];
}
そこでバインドされているクラスは、以下のAuthenticate.phpで定義されています。
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Guard;
class Authenticate
{
protected $auth;
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('auth/login');
}
}
return $next($request);
}
}
handle()内での、$this->auth->guest()は、ユーザーがゲスト、つまり認証されていないユーザーであるかどうかをチェックします。認証されていないなら、auth/loginにリダイレクトして、ログイン画面が表示されます。
routes.phpでのページ保護は、Route::groupで行うこともできます。例えば、以下のように複数のルートをまとめることができます。わかりやすいですね。
Route:: group(['prefix' => 'member', 'middleware' => 'auth'], function() {
Route::get('index', 'MemberController@getIndex');
Route::get('password', 'MemberController@getPassword');
Route::post('password', MemberController@postPassword');
Route::get('profile', 'MemberController@getProfile');
Route::post('profile', 'MemberController@postProfile');
Route::get('logout', 'MemberController@getLogout');
});
さらに、認証の保護しないページにおいて、すでに認証されているならスキップしてリダイレクトさせることも可能です。
以下では、ログインや登録画面にアクセスしたときにすでにログインしているなら、/homeにリダイレクトされます。ミドルウェアにおいて、guestが使用されていることに注意してください。このミドルウェアも先のKernel.phpで登録されています。
Route::group(['middleware' => 'guest'], function() {
Route::get('login', 'LoginController@getLogin');
Route::post('login', 'LoginController@postLogin');
Route::get('signup', 'SignupController@getSignup');
Route::post('signup', 'SignupController@postSignup');
});
これらのミドルウェアは、routes.phpだけでなくコントローラの中でも実行できます。例えば、前回まで使用してきたAuthController.php。
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
public function __construct()
{
$this->middleware('guest', ['except' => 'getLogout']);
}
...
}
guestのミドルウェアをコンストラクタで使用することにより、ログアウト(getLogout)以外のメソッド、つまり会員登録(getRegisterとpostRegister)とログイン(getLoginとpostLogin)のメソッドにおいて、すでにログインしているなら/homeにリダイレクトします。
