2015.7.16
0からはじめるPHP#35【Laravel5で作るデータベース#9-認証(ログイン)-】
ということで、最後に
管理画面を作ろうということで
ユーザー認証をやります。
管理画面は必ずしも必要ではないのですが、まぁあった方がGUI的にも分かりやすいですし、パソコンの扱いに長けてない人でも扱える画面にしておかないと
後の代で無茶苦茶にされかねないので。基本的にデータベースの完成は後輩に丸投げして、システムだけ僕が作るって感じでやるつもりなので(笑)
ところで、これが終われば基本的な機能は全て揃うことになるので、たぶん次回でLaravelで作るデータベース編は最終回のつもりです。
今回はログインを実装し、次回にログイン後の話をしたら話すことはもうないんじゃないかなーと。
もしかしたら次々回ぐらいまで持ち越すかも知れませんけど、大きな話題としてはこの認証機能関連が最後になるかと思われます。
管理画面からのレコード挿入なんかも、結局はクエリービルダーとバリデーションで実装しますし、新しい話題はないんですよね・・・・・・。
さて、認証機能自体はどう取り入れるのかといいますと、Laravel5にはユーザー認証の機能がデフォルトで備わっているらしいので、それを使ってみることにしましょう。
さて、今回作るデータベースにはユーザー登録は必要ないので、管理人認証のみを行うことになります。
ユーザー登録などの機能ももちろんついてます。この辺りはまた次のステップで、今回やる管理人認証を拡張した形で実装することになるんじゃないかなと思います。
で、まず
いきなり絶望から入るんですが、そのデフォルトでついているらしいユーザー認証にアクセスしようとすると
何故か「NotFoundHttpException」エラーが発生します。
Route::get('admin', ['middleware' => 'auth', 'uses' => 'YourController@func']);
こうするとAuth認証にアクセスすることができて、実際にアドレスが変わってるのでアクセスはできているようです。
こちらがその参考画像です。/adminにアクセスした結果なのですが、きちんと
auth/loginに変わっているので、おそらくここに問題はないようです。
ユーザー認証に関しては、名前とパスワードによる認証にしようと思って、ちょっとビューをいじったり、関数を追加したりしたんですが、別に何かを消したわけじゃないのでNotFoundエラーがでる理由はよくわからないんですよね。
そう思ってroute.phpを見てみると
使わないのでコメントアウトした一文があることに気づきました。このコメントを外してみましょう。
なんか一歩進みましたね。
僕が悪かったようです。
appビューがないということで、一体どこにあるのだろうということで探します。
viewフォルダの中に、さらにauthというのがありまして、そこにapp.blade.phpがないからだめだって言ってるみたいですね。
でもauthフォルダの中って別にいじってない気がするんですけどねえ・・・・・・
@extends('app')
@section('content')
<div class="container-fluid">
<div class="row">
<div class="col-md-8 col-m.....(以下略)
エラーが発生しているlogin.blade.phpを見てみると、確かに最初にextendで呼び出してますね。
app.blade.phpというファイルはどっかで見た気がする・・・・・・ということで、バックアップとして残しておいた旧データのビューフォルダを見たら、ありましたので、これを元あった位置
(AuthフォルダではなくViewフォルダ)に入れます。
ログインページが出てきました。これが認証ページになります。
実際に認証するためのユーザー名とパスワードももちろん設定しなくてはなりません。
最初、僕はadminというテーブルをテキトーに作って、ユーザー名をログインに使うために
このように手を加えたのですが
全く動きませんでした。
まず、第一に
テーブル名は"users"がデフォルトのようです。たぶん設定はできるんでしょうが、直感的に分からなかったのでデフォルトのままでまずは動くことを確認します。テーブル名を変える方法はまた後ほど調べればいいかなと。
ちなみに、テーブルのカラムは
"name","email","password","updated_at","created_at"が最低限必要みたいです。
これらはマイグレーションで初期設定ができるようですが
僕は邪魔なマイグレーションを消してしまったので使えません。
で、これらのカラムに規定値を代入したら動く
と思うっしょ?
僕はここでハマったんですが、一旦ログインは諦めて
一旦「Register」から登録してみます。
なんとパスワードは暗号化されていました。
僕のセキュリティ意識が低かったみたいですね
おそらく鍵は
.envのAPP_KEY定数かなぁと思ってます。
ちなみに、Laravel5の認証は
Authオートログイン機能がついてます。
これはログイン画面の
Remember meのチェックをONにしたら発動しまして、まぁ簡単に言うと
クッキーによるオートログインが行われるんですね。
具体的な期限は不明ですが、これがONになってるとログアウトするまでログインしっぱなしになるっていうものです。もちろん、暗号化などのセキュリティ対策はされてるっぽいですけど、まぁセキュアなデータを扱わない場合であれば活用した方がユーザビリティ向上につながるでしょうね。どうやって切ればいいかは分かりませんが、そもそもRemember meのチェックを非表示にすれば済む話ですし。
ちなみに、この機能を使うには
Remember_tokenカラムが必要です。
ただ、この機能のお陰でほんとにログインできてるのか怪しいので、ログアウトも実装してみましょう。
<a href="./admin">管理画面</a> @if(Auth::check())<a href="./signout">ログアウト</a>@endif
まず
ログインしてる時だけ"ログアウト"を表示というのはこれでいけます。ビューで使えるんですね、ファサードって。めちゃくちゃ簡単に実装できました。(笑)
では、routeにsignoutを追加してみましょう。
Route::get('signout', function(){
Auth::logout();
});
デフォルトにも機能はあるみたいですが、ちょっとどこにあるのか不明だったのでマニュアルを参考にクロージャで記述してみました。
ログアウトすると、ビューを指定していないので白紙のページが表示されるのみですが、もう一度アクセスすると実際にログアウトできているのが確認できます。
ちなみに、標準装備を使うとどうなるかも考えてみましょう。
どこに実体があるのか全くわからないので、呼び出すためのURLを調べるため、appビューを見てみます。
@if (Auth::guest())
<li><a href="{{ url('/auth/login') }}">Login</a></li>
<li><a href="{{ url('/auth/register') }}">Register</a></li>
@else
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ Auth::user()->name }} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url('/auth/logout') }}">Logout</a></li>
</ul>
</li>
@endif
実際の使い方はこんな感じみたいですね。
8行目の
{{ url('/auth/logout') }}がクサいので、これを入れればログアウトしてリダイレクトしてもらえるんですかね。urlなんて関数の実体は不明ですけど、とりあえずこれをコピーしてみますと、トップページにリダイレクトされます。直前のページじゃないのか・・・・・・。
このurlの正体は恐らく
ヘルパー関数ですね。
指定されたパスへの完全なURLを生成します。とのことです。実際にソースを見てみると絶対パスが生成されています。ということで、
auth/logoutにアクセスするとログアウトになるみたいですね。
ただ、それ以上のことはよくわからないんですよね。auth関連のどこを調べても
Logoutの関数が見つからない。ブラックボックスですね。
まぁ実際は先ほどクロージャに書いたように
Auth::logout();とだけ書けばログアウトできるっぽいので、リダイレクト先はその先で定義すれば良さそうですよね。
後はこれを自分流にカスタマイズすれば良さそうですね。
ということで、次回は管理者情報の更新を行ったり、あと
新規登録の制限をかけてこのシリーズは一旦終えることにしましょう。
終わらないかもしれないけど(笑)