Laravelに管理画面用認証追加

qiita.com

 

coinbaby8.com

 

1.  Admins テーブル作成

php artisan make:migration Admins

 

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class Admins extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Admins'function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->string('email')->unique();
                $table->integer('role');
                $table->string('password');
                $table->rememberToken();
                $table->timestamps();
            });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}

 

php artisan migrate

 

2.  モデル作成

php artisan make:model Admin

※User.phpをコピーしてclass名をAdminに変更する

class Admin extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    
    protected $table = 'Admins';
  protected $fillable = [
        'name''email''password''role'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password''remember_token',
    ];

}

 

3.  config/auth.phpの編集

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
 
        //管理者用追加
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
    ],

 

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        //管理者用追加
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],

 

4.  ログインしていない時のリダイレクト先の設定

 app/Exceptions/Handler.php に以下を追記。

これで、web.phpで、'middleware' => 'auth:admin'で設定したページに、ログインせずにアクセスすると、admin/loginにリダイレクトされる。

(こちらも参考)

https://readouble.com/laravel/5.6/ja/authentication.html

 

//管理画面用に追加
    public function unauthenticated($requestAuthenticationException $exception)
    {
        if($request->expectsJson()){
            return response()->json(['message' => $exception->getMessage()], 401);
        }
 
        if (in_array('admin'$exception->guards())) {
            return redirect()->guest(route('admin.login')); ←★ルーティングで設定したログインページ
        }
 
        return redirect()->guest(route('login'));
    }

 

ログイン後に、再度認証が必要なページにアクセスした際のリダイレクト先は、

/var/www/html/app/laravel/app/Http/Middleware/RedirectIfAuthenticated.php

に追記する。

 

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($requestClosure $next, $guard = null)
    {
        //変更。オリジナルは以下。
        //if (Auth::guard($guard)->check()) {
        //    return redirect('/home');
        //}
        if (Auth::guard($guard)->check()) {
            if ($guard=='admin') { //config/auth.phpで追加した管理者用のguards名
                return redirect('/admin/home');
            } else {
                return redirect()->intended('/home');
            }
        }
        
        return $next($request);
    }
}

 

5.  ルーティングの設定

管理者用に以下をweb.phpに追加

 

/*--------------------------------------------------------------------------
| Admin 認証不要
|--------------------------------------------------------------------------*/
Route::group(['prefix' => 'admin'], function() {
    Route::get('/',         function () { return redirect('/admin/login'); });
    Route::get('login',     'Admin\LoginController@showLoginForm')->name('admin.login');
    Route::post('login',    'Admin\LoginController@login');
});
 
/*--------------------------------------------------------------------------
| Admin ログイン後
|--------------------------------------------------------------------------*/
Route::group(['prefix' => 'admin''middleware' => 'auth:admin'], function() {
    Route::post('logout',   'Admin\LoginController@logout')->name('admin.logout');
    Route::get('home',      'Admin\HomeController@index')->name('admin.home');
});

 

 

6.  コントローラーの作成

app/Http/Controllers/の下にAdminフォルダをつくって、

その中にapp/Http/Controllers/Authの中のLoginController.phpとHomeController.phpをコピーする。

 

<LoginController.php>

<?php

//namespace App\Http\Controllers\Auth;
namespace App\Http\Controllers\Admin;//変更

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;


class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/admin/home';// 管理者のログイン後のリダイレクト先

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');//変更
    }

    public function showLoginForm()
    {
        return view('admin.login');//変更
    }
    protected function guard()
    {
        return Auth::guard('admin');  //変更
    }
    
    public function logout(Request $request)
    {
        Auth::guard('admin')->logout();  //変更
        $request->session()->flush();
        $request->session()->regenerate();
 
        return redirect('/admin/login');  //変更
    }
}

 

 

 <HomeController.php>

<?php

namespace App\Http\Controllers\Admin//Adminに変更

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:admin');//変更
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('admin.home');//変更
    }

}

 

 7.  ビューの作成

resources/viewsの下にadminフォルダをつくって、resources/views/auth/

login.blade.phpとresources/views/home.blade.phpをコピー。

 

また、resources/views/layouts/app.blade.phpをコピーして

app_admin.blade.phpを作成。

route('login')

のように、route()の箇所を全て

route('admin.login')

のように修正する。

 

8.  管理者用アカウントの作成

php artisan tinker

$admin = new App\Admin;

$admin->name = "hogehoge";

$admin->email = "hoge@hoge.com";

$admin->password = bcrypt("hogehoge");

$admin->save();

ctrl+c で終了

 

9.  通常のユーザーとセッション変数を分ける

(参考サイト)

https://qiita.com/sola-msr/items/65634826bcedf3ea4ca4

 

<?php
//管理画面用にセッションを分ける

//return [
$sessConf = [

    /*
    |--------------------------------------------------------------------------
    | Default Session Driver
    |--------------------------------------------------------------------------
    |
 

    途中略

];

//以下、adminの場合はセッションん名を変える
$uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';

// 管理者側用セッション
if (strstr($uri'/admin/') !== false || $uri === '/admin/login') {
    $sessConf['cookie'] = env(
        'SESSION_COOKIE_ADMIN',
        str_slug(env('APP_NAME''laravel'), '_').'_admin_session'
    );
}

return $sessConf;
 

 

.envに以下を追記

SESSION_COOKIE=hoge_user
SESSION_COOKIE_ADMIN=hoge_admin

 

以上