Laravelの認証機能をカスタマイズする
Laravelには、「laravelの認証機能を試す」のように、認証機能が備わっていますが、業務で使うために少しカスタマイズする必要があります。
ここでは、この機能について以下の2点への対応をしたいと思います。
・メールアドレスでの認証を、ユーザIDに変更する。
・ゲストユーザ、一般ユーザと管理者でサイトを制限するために、ロールを追加する。
1.ユーザマスタを変更する
まずは、認証用のテーブル(users)にカラムを追加します
(1)マイグレーションファイルを作成する。
コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。
php artisan make:migration update_users_table --table=users
(2)マイグレーションファイルを編集する。
database\migrationsに、「XXXX_XX_XX_XXXXXX_update_users_table.php」というファイルが作成されています。
これを編集し、up, downに「userid」「role」を追加します。
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('userid')->unique()->after('email');
$table->tinyInteger('role')->default(0)->after('password')->index('index_role')->comment('ロール');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('userid');
$table->dropColumn('role');
});
}
(3)マイグレーションを実行する。
コマンドプロンプトを開いて、プロジェクトのフォルダに移動して以下のコマンドを実行します。
php artisan migrate
以上でusersテーブルの変更が完了です。
2.Controllerを修正する
(1)Controllerを修正する
LoginControllerの最後に、username function を追加して、useridを返すようにします。
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
・・・
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* add
*/
public function username()
{
return 'userid';
}
}
3.Registerを修正
(1)formファザードをプロジェクトに追加する
ユーザマスタを登録する画面にuseridとroleを追加していきます。roleは「guest, user, admin」
の3種類をから、selectBoxによる選択で入力をさせます。selectBoxはformファザードを使いたいので
・コマンドプロンプトから、formファザードをプロジェクトに追加します。
composer require "laravelcollective/html"
・formファザードを有効にする
続いて、templateでformファザードを使えるようにconfig\app.phpを編集します。
'providers' => [
// ...
Collective\Html\HtmlServiceProvider::class,
// ...
],
'aliases' => [
// ...
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
// ...
],
(2)Registerを編集します。
Registerの画面に、userid,roleを追加します。
<div class="form-group row">
<label for="userid" class="col-md-4 col-form-label text-md-right">{{ __('userid') }}</label>
<div class="col-md-6">
<input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>
@if ($errors->has('userid'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('userid') }}</strong>
</span>
@endif
</div>
</div>
<!--
・・・・
-->
<div class="form-group row">
<label for="role" class="col-md-4 col-form-label text-md-right">{{ __('role') }}</label>
<div class="col-md-6">
{{Form::select('role', ['admin', 'user', 'guest'], null, ['class' => 'form-control'])}}
@if ($errors->has('role'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('role') }}</strong>
</span>
@endif
</div>
</div>
(3)useridによる認証を有効にする。
・app\User.phpのfillable に、userid, roleを追加します。
protected $fillable = [
'name', 'userid', 'role', 'email', 'password',
];
(4)ログイン画面で認証をメールアドレスから、useridに変更にする。
resources/views/auth/login.blade.phpを編集して、メールアドレスをuseridに変更します。
<div class="form-group">
<label for="userid" class="col-form-label">ユーザID</label>
<div class="">
<input id="userid" type="text" class="form-control{{ $errors->has('userid') ? ' is-invalid' : '' }}" name="userid" value="{{ old('userid') }}" required autofocus>
@if ($errors->has('userid'))
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('userid') }}</strong>
</span>
@endif
</div>
</div>
(5)RegisterControllerにuseridを追加する
createメソッドにuseridを設定するよう編集します。
※2018/12/4追加しました。
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'userid' => $data['userid'], // 追加
'password' => Hash::make($data['password']),
]);
}
これでユーザIDでログインして、roleによる権限でアプリの制御ができるようになります。