Laravel-Permissionを使うことで管理権者、管理グループを楽に設定。
ここではログイン画面をカスタマー用と管理者用に分けてみます。
・Authのカスタマイズ
・/login/{enter_role} とユーザーroleで判断。
・認証後、enter_role とユーザーroleが合わなければ強制ログアウト。
Laravel5.5とLaravel6.0で検証。
Laravel-Permission インストール が 必須 です。
・メソッドをオーバーライドするときは元ソースを確認することで理解アップ!
Authのカスタマイズ
App/Http/Controllers/Auth/LoginController.php
//追加
use Illuminate\Http\Request;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Support\Facades\Auth;
---
class LoginController extends Controller
{
---
use AuthenticatesUsers;
//オーバーライド
protected function redirectTo() {
if (auth()->user() !== null && auth()->user()->hasRole('admin')) {
return route('home');
} else {
return route('welcome');
}
}
//オーバーライド
public function showLoginForm($role = null)
{
session(['enter' => $role]);
return view('auth.login');
}
//オーバーライド
protected function authenticated(Request $request, $user) {
$role = $user->getRoleNames('items')[0];
$is_customer_login = (session('enter') == null && $role == 'customer');
$is_role_login = (session('enter') == $role);
if ($is_customer_login || $is_role_login) {
//
} else {
Auth::logout();
}
}
}
app/Http/Controllers/Auth/RegisterController.php
//追加
use Spatie\Permission\Traits\HasRoles;
---
class RegisterController extends Controller
{
---
//オーバーライド
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
//デフォルト: role = 'customer'
$user->assignRole('customer');
return $user;
}
}
route設定
routes/web.php
//ログイン後のリダイレクト先
Route::get('/', function () {
return view('welcome');
});
Route::get('/home', 'HomeController@index')->name('home');
//追加
Route::get('/login/{role?}', 'Auth\LoginController@showLoginForm');
画面の色設定(レイアウト)
resources/views/layouts/app.blade.php
//追加変更
<link href="{{ asset('css/app.css') }}" rel="stylesheet">
@if (session('enter') !== null)
<style>body{background-color: tomato;}</style>
@endif
---
<!-- Authentication Links -->
@guest
@if (session('enter') == null)
<li><a href="{{ route('login') }}">Login</a></li>
<li><a href="{{ route('register') }}">Register</a></li>
@endif
@else
--
@endguest
---
ログイン後の画面表示
resources/views/home.blade.php
---
//変更
<div class="panel-body">
@role('admin')
<div class="alert alert-success">管理者様
@endrole
@role('customer')
<div>お客様
@endrole
のログインです。</div>
</div>
動作確認
Laravel5.5 + Laravel-Permission-v2
Laravel6.0 + Laravel-Permission-v3
ユーザーデータは Laravel-Permission インストール を参照。
customerユーザー
/login -> ログイン
管理者ユーザー
/login/admin -> ログイン
新規ユーザー登録はcustomerになります。
管理者等はtinkerやseedで登録してください。
ご意見・ご指摘お願いします。