Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Laravel-Permission で管理者ログイン

More than 1 year has passed since last update.

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 -> ログイン
WS000046.JPG
管理者ユーザー
/login/admin -> ログイン
WS000046.JPG

新規ユーザー登録はcustomerになります。
管理者等はtinkerやseedで登録してください。
ご意見・ご指摘お願いします。

Fell
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away