Spring boot 使ってみた

Spring Tool Suiteのダウンロード

Spring Tool Suiteは64bit版のJavaを使用している場合32bit版では動作しません。下記URLのページのトップのダウンロードでは、32bit版がダウンロードされるので、「See all version」から64bit版を探してダウンロードしましょう。

【Spring Tool Suite ダウンロード先】
URL : http://spring.io/tools

解凍すると「sts-bundle」というフォルダができるので、その中の「sts-*.*.*.RELEASE」⇒「STS.exe」を実行しましょう。

今回は空きのあるDドライブとしました。

早速起動しました

aws ec2 への vim インストール方法

dnf install vim-enhanced

root@ip-172-31-56-20 html]# dnf install vim-enhanced
Last metadata expiration check: 0:49:55 ago on Mon 08 Jun 2020 11:01:08 PM UTC.
Dependencies resolved.
================================================================================
 Package         Arch    Version              Repository                   Size
================================================================================
Installing:
 vim-enhanced    x86_64  2:8.0.1763-13.el8    rhel-8-appstream-rhui-rpms  1.4 M
Installing dependencies:
 gpm-libs        x86_64  1.20.7-15.el8        rhel-8-appstream-rhui-rpms   39 k
 vim-common      x86_64  2:8.0.1763-13.el8    rhel-8-appstream-rhui-rpms  6.3 M
 vim-filesystem  noarch  2:8.0.1763-13.el8    rhel-8-appstream-rhui-rpms   48 k

Transaction Summary
================================================================================
Install  4 Packages

Total download size: 7.8 M
Installed size: 30 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): vim-filesystem-8.0.1763-13.el8.noarch.rp 352 kB/s |  48 kB     00:00
(2/4): vim-enhanced-8.0.1763-13.el8.x86_64.rpm  7.3 MB/s | 1.4 MB     00:00
(3/4): gpm-libs-1.20.7-15.el8.x86_64.rpm        349 kB/s |  39 kB     00:00
(4/4): vim-common-8.0.1763-13.el8.x86_64.rpm     22 MB/s | 6.3 MB     00:00
--------------------------------------------------------------------------------
Total                                            19 MB/s | 7.8 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          1/4
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          1/4
  Installing       : vim-filesystem-2:8.0.1763-13.el8.noarch                2/4
  Installing       : vim-common-2:8.0.1763-13.el8.x86_64                    3/4
  Installing       : vim-enhanced-2:8.0.1763-13.el8.x86_64                  4/4
  Running scriptlet: vim-enhanced-2:8.0.1763-13.el8.x86_64                  4/4
  Running scriptlet: vim-common-2:8.0.1763-13.el8.x86_64                    4/4
  Verifying        : vim-filesystem-2:8.0.1763-13.el8.noarch                1/4
  Verifying        : vim-common-2:8.0.1763-13.el8.x86_64                    2/4
  Verifying        : vim-enhanced-2:8.0.1763-13.el8.x86_64                  3/4
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          4/4

Installed:
  gpm-libs-1.20.7-15.el8.x86_64         vim-common-2:8.0.1763-13.el8.x86_64
  vim-enhanced-2:8.0.1763-13.el8.x86_64 vim-filesystem-2:8.0.1763-13.el8.noarch

Complete!
[root@ip-172-31-56-20 html]# 

プログラミング学習の講師になるには

はじめに

教育に携わりたいと思い、まずは関わることのできる企業を調査しました。

ちなみに、どこかと契約してしまうとそこを辞めても辞めた後3年間は競合他社と契約できなくなる可能性があります。契約書に含まれているかどうかよく見て慎重に決めた方が良さそうです。

調査方法としては下記です。

  • 募集サイトを見る
  • カンファレンス等で企業ブースで話しを伺う
  • 応募して面接時に詳しく聞く

注意事項

現在は常に新たな教育スクールが立ち上げっております。個人での調べですので情報が更新されている可能性もあります。現在の情報は公式の情報に当たってください。

自分がやる前提で情報収拾したため情報にバイアスがかかっていると思います。情報が少ない企業は、自分の勤務条件に合わなかったり、探すのをやめた後だったなどの理由によるもので、問題があったわけではありません。 念のため企業選びにおける自分の軸を書いておきます。

  • 副業としてやる (もしメインにするとしても、開発業務と兼務したい)
    • 仕事では 40年のキャリアがある
    • 理由: 教えることの取捨選択が大事だと思っていて、その取捨選択の判断軸の一つとして「実際の現場ではどうか」もある。”実際”というのは移り変わるものなので、現場から離れたら、自分の考える”実際の現場”の知識が、時代遅れであったり現実と離れた”想像の現場”となってしまいそうで怖い。
  • 企業としても生徒に真摯に向き合っていること
    • 本当にそのカリキュラムでその生徒の目的が達成できるのか
  • 本業に影響を及ぼさない (ただし、本業は完全フレックスなのである程度柔軟にスケジュールは組める)
    • シフト時間外の業務が(緊急時以外)発生しない (「質問が来たら数時間以内に返事する」といった要件がある企業もあるので)
  • やることに対して収入が低すぎない
    • オンラインプログラミングスクールの市場の給料としては 1600~2000円/時 が相場とのことでした

企業紹介

TechAcademy

プログラミング講師(メンター)募集 | TechAcademy テックアカデミー

業務

業務としては 3 種類です。

  • メンター (1対1で) ビデオチャット
    • カリキュラムや教材が準備されている
    • 一人の生徒を一貫して一人のメンターが見る
  • Slack 上で質問対応
  • 課題をレビューする

動画が公開されています。

TechAcademy メンター業務オリエンテーション動画 – YouTube

ただし、 動画内容の中で一つ変更点があり、「時給については研修時給が廃止になり、プログラミング系は一律時給1600円スタートとなります。」とのこと。

稼働時間

  • 週 4 時間以上
  • シフト時間外での対応はない

給料

  • 時給: 1600 ~ 2500 円 (最初は一律 1600円)
    • 現在の講師の大部分は時給 1800~2000円
  • 年二回昇給
  • 稼ぎたいよりも教育事業をしたい人

侍アカデミー

生徒さんをサポート!プログラミングスクールのインストラクターWANTED! – 侍エンジニア塾のエンジニア中途・インターンシップ・契約・委託の求人 – Wantedly

メンターに任せる部分が多いので、教育者としてがっつりやりたい人は良いと思います。

業務

  • マンツーマン指導
  • ざっくりとしたカリキュラムはあるがメンターに任せる
    • 「カリキュラムはあるにはあるが、生徒に合わせてメンターが教えることを決める。宿題とかもメンターの裁量で適時だす」とのこと
    • 個人でプログラミング教室を開いている人と生徒とのマッチングサービスに近そう
  • 90分/週 (1回90分)
    • 期間: 1 ヶ月, 3 ヶ月, 6 ヶ月
  • オンラインか実際に会うかはメンターと生徒に任せる
  • 講義とは別に、質問を随時受け付ける
    • 数時間以内に回答
    • 回答に使った時間も時給は出る
  • 受け持つ生徒の決め方
    • 会社側で生徒と面談 (60~90分くらい手厚くやる)
    • 面談の結果、要望等をメンター陣に伝えて募集する

稼働時間

  • 1 人につき 90分/週 (1回90分)
  • 随時質問を受け付け、数時間以内に返答

給料

時給: 2000円

GEEK JOB

プログラミングの楽しさを伝える!空き時間に『教える』仕事やってみませんか? – グルーヴ・ギア株式会社のWeb エンジニア中途・インターンシップ・契約・委託の求人 – Wantedly

CodeCamp

プログラミング講師募集 | CodeCamp ネット上の情報のみ記載します。

業務

  • メンター (1対1で) ビデオチャットで講義
  • カリキュラム・教材が用意されている

給料

  • 時給: 2700 ~ 4200 円 (これは正社員も含めたものなので、副業のメンターとして契約する場合の実態は不明)
    • 2018/3月に見たときは 2000 ~ 5000 円だったような??

ジーズアカデミー

講師採用|採用情報|デジタルハリウッド株式会社

業務

  • 副業かつオンラインを希望する場合、卒業課題としてアプリを作る過程があり、そのときのメンターとして勤務できる
  • 土日だけ、夜だけなども可能

カサレアル

技術研修講師 | 募集要項 | 株式会社カサレアル 採用情報

副業としてやるのは想定してなさそうでしたが、ブースで直接話しを聞けたので書いておきます。
関わり方等、柔軟に対応していただけるようです!

業務

  • 企業向けの研修
  • カリキュラムの企画~実施、評価
    • 他の会社でのメンターだと用意されているカリキュラムに沿って授業することが多いので、企画からやりたい人とかは良さそう
  • 教育された講師が在籍している
    • Apple でのプログラミング教育者の認定

アイデミー

AIのプログラミング学習サービスでは業界最王手の会社でスキルアップを目指すなら、アイデミー!| 採用情報

業務

業務としては 3 種類です。

  • 受講者の方のSlack上での質問対応
  • 受講者の方に提出していただいたコードの添削
  • コンテンツの編集

稼働時間

週 1日からOK
基本となる曜日プラス希望の日にちに業務に入っていただく形になります。

給料

時給: 1200 ~ 3000 円 (基本時給プラス成果報酬)

サポーターズ CoLab

サポーターズCoLab – 若手エンジニアが「技術でつながる」仲間探しサービス

ほかのサービスと違い、プログラミング教育を一貫してやるのではなく単発の勉強会を開催しています。(実際は教育メインの会社ではなく、サービスの一環なのだと思います)

若手(20代とのこと) を対象とした勉強会の講師として 1, 2 時間話す仕事をもらえます。

勉強会やカンファレンスで発表しても賃金が発生しないことが多いので、講師として謝礼がもらえるのは珍しいと思い記載しました。

まとめ

「プログラミング メンター募集」と検索すると数社しか出ないのですが、意外とたくさんありました。

似てるように見えても授業方針や雰囲気が違うので、それぞれの会社に実際に聞きまわってみるのは大切ですね。

SQLコマンド一覧

データベース一覧の表示(show databases)

データベースの一覧を表示するには、以下の「show databases」コマンドを使用します。

【コマンド書式】MySQL

show databases;

データベースの追加(create database)

【コマンド書式】MySQL

create database <データベース名>;

データベースの削除(drop database)

【コマンド書式】MySQL

drop database <データベース名>;

SQLテーブル操作コマンド一覧

テーブル一覧を表示(show tables)

【コマンド書式】MySQL

show tables;

テーブルの追加(create table)

【コマンド書式】MySQL

create table <テーブル名> (<列名> <列の型> [オプション], …, … );

create table studentslist (    
id int not null auto_increment primary key, 
   name varchar(255) not null,
   gender varchar(255) not null,
   committeeid int not null
);

テーブルの削除(drop table)

【コマンド書式】MySQL

drop table <テーブル名>;

SQLテーブル内操作コマンド一覧

ここでは、データベースのテーブル内を操作するコマンドについて解説していきます。

テーブル内の列を確認(show columns from)

【コマンド書式】MySQL

show columns from <テーブル名>;

テーブル内に列を追加(alter table add)

【コマンド書式】MySQL

alter table <テーブル名> add <新しい列名> <新しい列の型> after <列の挿入場所>;

【コマンド例】

studentslistテーブルのcommitteeid列の後ろに「email」(text型)の列を追加する例です。MySQL

alter table studentslist add email text after committeeid;

テーブル内の列を削除(alter table drop)

【コマンド書式】MySQL

alter table <テーブル名> drop <列名>;

テーブル内の列名を変更する(alter table change)

データベースのテーブル内の列名を変更するには、以下の「alter table change」コマンドを使用します。

【コマンド書式】MySQL

alter table <テーブル名> change <古い列名> <新しい列名> <新しい列の型>;

【コマンド例】

studentslistテーブルの「email」列を「emailaddress」(text型)という列名に変更する例です。MySQL

alter table studentslist change email emailaddress text;

テーブルに行を追加(insert into)

【コマンド書式】MySQL

insert into     <テーブル名> (<列1>, <列2>, …)values    (<列1の値>, <列2の値>, …);

【コマンド例】

studentslistテーブルのname列に「サイトウ」、gender列に「男性」の行を追加する例です。MySQL

insert into    studentslist (name, gender) values    (‘サイトウ’, ‘男性’);

テーブルの行を削除(delete from)

【コマンド書式】MySQL

delete from <テーブル名> [where <削除条件>];

【コマンド例】

studentslistテーブルのname列が「サイトウ」の行を削除する例です。MySQL

delete from studentslist where name = ‘サイトウ’;

テーブルの行を更新(update)

【コマンド書式】MySQL

update <テーブル名>set <列1> = <列1の値>, [<列1> = <列1の値> …][where <条件式>];

【コマンド例】

studentslistテーブルのname列が「サイトウ」の行において、committeeid列を4に更新する例です。MySQL

update studentslistset committeeid = 4where name = ‘サイトウ’;

まとめ

忘れた際にご活用ください

Laravel デバッグバーをインストール

Laravelライブラリの追加方法

まずは composer でインストールします。


$ cd { laravel-project }
$ composer require barryvdh/laravel-debugbar

もし上手く composer でインストールができなかったらバージョンを指定してあげるといいです。


$ composer require barryvdh/laravel-debugbar:2.4

設定ファイル(config/app.php)の編集

2)サービス・プロバイダーの追加(config/app.php)

Laravelの設定ファイルである config/app.php にてサービスプロバイダーの項目にデバッグバーを追記します。


 'providers' => [
        :
  Barryvdh\Debugbar\ServiceProvider::class,
  ],

3)ファサードの追加(config/app.php)

Laravelの設定ファイルである config/app.php にてファサードの項目にデバッグバーを追記します。


  'aliases' => [
        :
     'Debugbar' => Barryvdh\Debugbar\Facade::class,
  ],

4).envファイルの編集

ローカル環境に置いてある .envファイル の APP_DEBUG の定数をtrueにします。


:
APP_DEBUG=true
:

envファイルを編集したら


php artisan config:cache

でキャッシュをクリアしてあげましょう。

5)動作確認

ブラウザを起動してビューの画面を確認します。

バグが発生したらlaravelデバッグバーを使ってデバッグ作業をしましょう。

今回は以上となります

git再インストール【CentOS】

下記コマンドで、Cannot open で上手くいかれなかったかたはぜひ試してみてください。

# yum -y install https://centos7.iuscommunity.org/ius-release.rpm
Loaded plugins: fastestmirror
Cannot open: https://centos7.iuscommunity.org/ius-release.rpm. Skipping.
Error: Nothing to do

IUSリポジトリを登録

まず、IUSリポジトリを登録します。
IUSのサイトに対処法が書かれておりますので下記コマンドを実施ください。
https://ius.io/setup

# yum install \
https://repo.ius.io/ius-release-el7.rpm \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Gitのインストール

それではGitをインストールします。

# yum install git --enablerepo=ius --disablerepo=base,epel,extras,updates


その際に下記エラーが発生する場合は次の依存性パッケージをバージョンを合わせて行ってみてください

--> Finished Dependency Resolution
Error: Package: git224-2.24.2-1.el7.ius.x86_64 (ius)
           Requires: emacs-filesystem >= 24.3
Error: Package: git224-2.24.2-1.el7.ius.x86_64 (ius)
           Requires: libsecret-1.so.0()(64bit)
Error: Package: git224-2.24.2-1.el7.ius.x86_64 (ius)
           Requires: perl(Term::ReadKey)
Error: Package: git224-perl-Git-2.24.2-1.el7.ius.noarch (ius)
           Requires: perl(Error)
Error: Package: git224-core-2.24.2-1.el7.ius.x86_64 (ius)
           Requires: libpcre2-8.so.0()(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

以下のコマンドで依存パッケージも含めてインストールします。

# yum install git224-2.24.2-1.el7.ius.x86_64

途中でkeyのインストールが聞かれるので y を押します。

 Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-7
Importing GPG key 0x4B274DF2:
 Userid     : "IUS (7) <dev@ius.io>"
 Fingerprint: c958 7a09 a11f d706 4f0c a0f4 e558 0725 4b27 4df2
 Package    : ius-release-2-1.el7.ius.noarch (@/ius-release-el7)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-IUS-7

is this ok [y/N]:

インストールが成功しました。バージョンを確認します。

# git version
git version 2.24.2

IUSリポジトリを無効にしたい場合は、以下のコマンドを実行します。

# yum-config-manager --disable ius

お疲れさまでした

2016年から6年間CodeCamp講師でしたが本日解除されました。くそお世話になりました【サンジ風】

悲しいお話ではありません。プログラミングスクールへの参画を数社とこちらのCodeCampさんにお世話になっておりました。最近はCodeCampさんの生徒さんが著しく少なくなってきましたので、またコンビニ並の単価だったのでここ数年は幽霊講師でした。先月アンケートで「昨年度の運営利益の用途」と「カリキュラムの問題」の指摘をさせて頂き、対策案をご意見をさせていただきましたところ契約続行しないということになりました。致し方ないかなと感じております

しかし、いきなり講師間の連絡であるslackが閉鎖されたのでご挨拶も行えず、継続講習の問題発生時の相談窓口も閉鎖されたので触れてはいけないことだったんだー。と切羽詰まっている現状を知ることができました。

本当に先生方や、生徒様いままで大変お世話になりました

がんばって躍進されてください。ご健康をお祈りいたします。

CodeCamp様も益々のご発展をお祈りいたします。お世話になりました。

※数年前までは、時給を倍にするからこの時間は講師をお願いしますと言われていたのですが。懐かしい思い出です(当時はびっくりしてました)

マンツーマン講義はチケット制度ですが、若い先生が多くはいられてますので是非、下記クリックより無料相談を行ってご検討ください。

マルチ認証の実現方法【Laravel6:User/Admin分離ログイン】

前提知識

  • Laravel6が使える
  • LaravelのAuth認証を実装した事がある

php artisan make:authは別記事を見てください

参考ソース:Laravel6-Multi-Login

ログイン機能を実装

Migration

まずはMigrationとModelをartisanコマンドを使って作成していきましょう
今回はサボらずに実戦でよく用いられるModelsディレクトリを用意します。

php artisan make:model Models/Admin -m

元々用意されているcreate_users_table.phpの中身をコピーして
作成したcreate_admins_table.phpに貼り付けましょう。database/migrations/2020_02_01_123456_create_admins_table.php

<?php

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

class CreateAdminsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('admins');
    }
}

Migrationを実行しておきましょう

php artisan migrate

これでテーブルの準備は出来ました。

Seeder

UserAdminでログインの検証がしたいので、ターミナルからコマンドを叩いて、それぞれテストユーザーを予め作っておきましょう

php artisan make:seeder UsersTableSeeder
php artisan make:seeder AdminsTableSeeder

Userdatabase/seeders/UsersTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name'              => 'user',
            'email'             => 'user@example.com',
            'password'          => Hash::make('12345678'),
            'remember_token'    => Str::random(10),
        ]);
    }
}

Admindatabase/seeders/AdminsTableSeeder.php

<?php

use Illuminate\Database\Seeder;

class AdminsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('admins')->insert([
            'name'              => 'admin',
            'email'             => 'admin@example.com',
            'password'          => Hash::make('12345678'),
            'remember_token'    => Str::random(10),
        ]);
    }
}

同時に実行出来るように元々用意されていうDatabaseSeeder.phpで設定します。database/seeders/DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            UsersTableSeeder::class,
            AdminsTableSeeder::class,
        ]);
    }
}

Seederを実行しておきましょう

php artisan db:seed

これでテストデータの準備は出来ました。

Model

先ほどのmigrationを作る工程のコマンドでModelsというディレクトリが作成されているはずなので、
最初から用意されているUser.phpModelsにぶち込んでおきましょう。

namespaceを変更するのを忘れずに!!app/Models/User.php

namespace App\Models;

別ファイルでUser.phpをuseしている箇所があるので、そちらも抜けなく変更しましょう。

下記ファイルのApp\User部分をApp\Models\Userに変更します。

  • app/Http/Controllers/Auth/RegisterController.php
  • config/auth.php
// App\User
App\Models\User

では管理者用のAdmin.phpも作成しておきましょう。

extendsがModelからAuthenticatableに変わっているので注意しましょう

app/Models/Admin.php

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use Notifiable;

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

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

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

認証方式の追加(Guard)

それじゃAdminの認証方式を追加します。
この記事を読むと良いです。

Laravel の Guard(認証) って実際何をやっているのじゃ?

config/auth.php

<?php

return [

    // デフォルトの認証をwebからuserに変更
    'defaults' => [
        'guard' => 'user',
        'passwords' => 'users',
    ],

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

        // Admin用の認証を追加
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ]
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Models\Admin::class,
        ]
    ],

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],

        'admins' => [
            'provider' => 'admins',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ]
    ],

    'password_timeout' => 10800,

];

Controller

さて下の構成にするためにまずはControllers配下にAdminUserディレクトリを作成しましょう。

controllers
   ├── Admin
   │   ├── Auth
   │   │   ├── LoginController.php
   │   │   ├── RegisterController.php
   │   └── HomeController.php
   ├── User
   │   ├── Auth
   │   │   ├── LoginController.php
   │   │   ├── RegisterController.php
   │   └── HomeController.php
   └── Controller.php

作成できたら以下のコマンドをターミナルから入力してファイルを作成しましょう。
HomeControllerはLogin後の画面を出力するために使用します。

Admin

php artisan make:controller Admin/HomeController --resource

User

php artisan make:controller User/HomeController --resource

….完了したら元々あるAuthディレクトリをそれぞれの階層に設置してください!

Adminapp/Http/Controllers/Admin/HomeController.php

<?php

namespace App\Http\Controllers\Admin;

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

class HomeController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth:admin');
    }

    public function index()
    {
        return view('admin.home');
    }

}

Userapp/Http/Controllers/User/HomeController.php

<?php

namespace App\Http\Controllers\User;

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

class HomeController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth:user');
    }

    public function index()
    {
        return view('user.home');
    }

}

Routing(ルーティング)

作成したControllerとパスを紐づける&Auth認証をそれぞれ指定します。routes/web.php

<?php

// ユーザー
Route::namespace('User')->prefix('user')->name('user.')->group(function () {

    // ログイン認証関連
    Auth::routes([
        'register' => true,
        'reset'    => false,
        'verify'   => false
    ]);

    // ログイン認証後
    Route::middleware('auth:user')->group(function () {

        // TOPページ
        Route::resource('home', 'HomeController', ['only' => 'index']);

    });
});

// 管理者
Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function () {

    // ログイン認証関連
    Auth::routes([
        'register' => true,
        'reset'    => false,
        'verify'   => false
    ]);

    // ログイン認証後
    Route::middleware('auth:admin')->group(function () {

        // TOPページ
        Route::resource('home', 'HomeController', ['only' => 'index']);

    });

});

Auth

Laravel6.8以降から$redirectToのプロパティがRouteServiceProviderの定数で管理されるようになりました!今回はRouteServiceProviderの例を書いていきます!

参考
【Laravel6.8以降】認証関連のリダイレクト先の設定変更がDRYになったよ

RouteServiceProvider

ではデフォルトのリダイレクト先が/homeになっている部分を変更して、なおかつAdminのリダイレクト先を指定する定数も追加します。

Laravel6.8以下のバージョンの方はLoginControllerなどに用意されている$redirectToプロパティの値を変更してください。

app/Providers/RouteServiceProvider.php

// Userのリダイレクト先
public const HOME = '/user/home';

// Adminのリダイレクト先
public const ADMIN_HOME = '/admin/home';

Authenticate(未ログイン時の挙動)

未ログイン時にログイン認証が必要なページにアクセスした時のリダイレクト先を指定します。app/Http/Middleware/Authenticate.php

<?php

namespace App\Http\Middleware;

use Illuminate\Support\Facades\Route;
use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    protected $user_route  = 'user.login';
    protected $admin_route = 'admin.login';

    protected function redirectTo($request)
    {
        // ルーティングに応じて未ログイン時のリダイレクト先を振り分ける
        if (!$request->expectsJson()) {
            if (Route::is('user.*')) {
                return route($this->user_route);
            } elseif (Route::is('admin.*')) {
                return route($this->admin_route);
            }
        }
    }
}

RedirectIfAuthenticated(ログイン時の挙動)

逆にログインしてる時に/loginにアクセスしてきた時のリダイレクト先を指定します。app/Http/Middleware/RedirectIfAuthenticated.php

<?php

namespace App\Http\Middleware;

use App\Providers\RouteServiceProvider;
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($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check() && $guard === 'user') {
            return redirect(RouteServiceProvider::HOME);
        } elseif (Auth::guard($guard)->check() && $guard === 'admin') {
            return redirect(RouteServiceProvider::ADMIN_HOME);
        }

        return $next($request);
    }
}

User

ログイン

app/Http/Controllers/User/Auth/LoginController.php

<?php

namespace App\Http\Controllers\User\Auth;

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

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

    public function __construct()
    {
        $this->middleware('guest:user')->except('logout');
    }

    // Guardの認証方法を指定
    protected function guard()
    {
        return Auth::guard('user');
    }

    // ログイン画面
    public function showLoginForm()
    {
        return view('user.auth.login');
    }

    // ログアウト処理
    public function logout(Request $request)
    {
        Auth::guard('user')->logout();

        return $this->loggedOut($request);
    }

    // ログアウトした時のリダイレクト先
    public function loggedOut(Request $request)
    {
        return redirect(route('user.login'));
    }
}
新規登録

app/Http/Controllers/User/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\User\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Models\User;

class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

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

    // Guardの認証方法を指定
    protected function guard()
    {
        return Auth::guard('user');
    }

    // 新規登録画面
    public function showRegistrationForm()
    {
        return view('user.auth.register');
    }

    // バリデーション
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name'     => ['required', 'string', 'max:255'],
            'email'    => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    // 登録処理
    protected function create(array $data)
    {
        return User::create([
            'name'     => $data['name'],
            'email'    => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

Admin

基本的に上のuserの部分をadminに直すだけです。
なのでコメントは外します。

ログイン

app/Http/Controllers/Admin/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

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

class LoginController extends Controller
{
    use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::ADMIN_HOME;

    public function __construct()
    {
        $this->middleware('guest:admin')->except('logout');
    }

    protected function guard()
    {
        return Auth::guard('admin');
    }

    public function showLoginForm()
    {
        return view('admin.auth.login');
    }

    public function logout(Request $request)
    {
        Auth::guard('admin')->logout();

        return $this->loggedOut($request);
    }

    public function loggedOut(Request $request)
    {
        return redirect(route('admin.login'));
    }
}
新規登録

app/Http/Controllers/Admin/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Models\Admin;

class RegisterController extends Controller
{
    use RegistersUsers;

    protected $redirectTo = RouteServiceProvider::ADMIN_HOME;

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

    protected function guard()
    {
        return Auth::guard('admin');
    }

    public function showRegistrationForm()
    {
        return view('admin.auth.register');
    }

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name'     => ['required', 'string', 'max:255'],
            'email'    => ['required', 'string', 'email', 'max:255', 'unique:admins'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }

    protected function create(array $data)
    {
        return Admin::create([
            'name'     => $data['name'],
            'email'    => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }
}

View

viewは以下の構成で実装します。

views
├── user
│   ├── auth
│   │   ├── login.blade.php
│   │   └── register.blade.php
│   └── home.blade.php
│
├── admin
│   ├── auth
│   │   ├── login.blade.php
│   │   └── register.blade.php
│   └── home.blade.php
│
└── layouts
    ├── user
    │    └── app.blade.php
    │
    └── admin
         └── app.blade.php
layouts

Userresources/views/layouts/user/app.blade.php

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
            <div class="container">
                <a class="navbar-brand" href="{{ url('/') }}">
                    {{ config('app.name', 'Laravel') }}
                </a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <!-- Left Side Of Navbar -->
                    <ul class="navbar-nav mr-auto">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ml-auto">
                        <!-- Authentication Links -->
                        @unless (Auth::guard('user')->check())
                            <li class="nav-item">
                                <a class="nav-link" href="{{ route('user.login') }}">{{ __('Login') }}</a>
                            </li>
                            @if (Route::has('user.register'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('user.register') }}">{{ __('Register') }}</a>
                                </li>
                            @endif
                        @else
                            <li class="nav-item dropdown">
                                <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                    <a class="dropdown-item" href="{{ route('user.logout') }}"
                                       onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                        {{ __('Logout') }}
                                    </a>

                                    <form id="logout-form" action="{{ route('user.logout') }}" method="POST" style="display: none;">
                                        @csrf
                                    </form>
                                </div>
                            </li>
                        @endunless
                    </ul>
                </div>
            </div>
        </nav>

        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>

Admin

こっちも基本的にuseradminに変えてるだけresources/views/layouts/admin/app.blade.php

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    <title>{{ config('app.name', 'Laravel') }}</title>

    <!-- Scripts -->
    <script src="{{ asset('js/app.js') }}" defer></script>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
            <div class="container">
                <a class="navbar-brand" href="{{ url('/') }}">
                    {{ config('app.name', 'Laravel') }}
                </a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <!-- Left Side Of Navbar -->
                    <ul class="navbar-nav mr-auto">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ml-auto">
                        <!-- Authentication Links -->
                        @unless (Auth::guard('admin')->check())
                            <li class="nav-item">
                                <a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a>
                            </li>
                            @if (Route::has('admin.register'))
                                <li class="nav-item">
                                    <a class="nav-link" href="{{ route('admin.register') }}">{{ __('Register') }}</a>
                                </li>
                            @endif
                        @else
                            <li class="nav-item dropdown">
                                <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                    {{ Auth::user()->name }} <span class="caret"></span>
                                </a>

                                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                    <a class="dropdown-item" href="{{ route('admin.logout') }}"
                                       onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                        {{ __('Logout') }}
                                    </a>

                                    <form id="logout-form" action="{{ route('admin.logout') }}" method="POST" style="display: none;">
                                        @csrf
                                    </form>
                                </div>
                            </li>
                        @endunless
                    </ul>
                </div>
            </div>
        </nav>

        <main class="py-4">
            @yield('content')
        </main>
    </div>
</body>
</html>

View(ログイン)

スクリーンショット 2020-02-20 16.51.54.png

先ほどSeederで登録した情報でログインできます

Userresources/views/user/auth/login.blade.php

@extends('layouts.user.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('user.login') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Adminresources/views/admin/auth/login.blade.php

@extends('layouts.admin.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Login') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('admin.login') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <div class="col-md-6 offset-md-4">
                                <div class="form-check">
                                    <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>

                                    <label class="form-check-label" for="remember">
                                        {{ __('Remember Me') }}
                                    </label>
                                </div>
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-8 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Login') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
View(新規登録)
スクリーンショット 2020-02-20 16.52.39.png

Userresources/views/user/auth/register.blade.php

@extends('layouts.user.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Register') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('user.register') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Register') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Adminresources/views/admin/auth/register.blade.php

@extends('layouts.admin.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">{{ __('Register') }}</div>

                <div class="card-body">
                    <form method="POST" action="{{ route('admin.register') }}">
                        @csrf

                        <div class="form-group row">
                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>

                            <div class="col-md-6">
                                <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>

                            <div class="col-md-6">
                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    {{ __('Register') }}
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

View(ログイン後の画面)

スクリーンショット 2020-02-20 16.53.24.png

Userresources/views/user/home.blade.php

@extends('layouts.user.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    You are logged in!
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Adminresources/views/admin/home.blade.php

@extends('layouts.admin.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">Dashboard</div>

                <div class="card-body">
                    @if (session('status'))
                        <div class="alert alert-success" role="alert">
                            {{ session('status') }}
                        </div>
                    @endif

                    You are logged in!
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

ご活用ください

2021.08.21 GitHubでhttpsのパスワード認証が廃止されました。Please use a personal access token instead.

作業中にgit pushしたところいままでうまく言っていたのですが下記エラーが発生しました。

$ git push origin main
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access 'https://github.com/名前/リポジトリ.git/': The requested URL returned error: 403

Please use a personal access token instead.
訳: 代わりにパーソナルアクセストークンを使用してください。

事件です。GitHubで2021年8月13日にパスワード認証が廃止されたそうです。
悔しいですね。個人アクセストークンを使うようにしましょう

GitHub 個人アクセストークンを作成する

GitHubにアクセスするとき必要となる、個人アクセストークンを作成していきます。

個人アクセストークンとは、「コマンドラインでのGit操作」や「Gitを使用するアプリケーション」「Gitリポジトリに直接アクセスするアプリケーションやサービス」を利用するときのパスワードの代わりになるものです。GitHubは、2021年8月13日以降、Git操作におけるパスワード認証を廃止し、トークンベースの認証を必須にする方針を発表しています。 これにより、パスワードを用いてのアクセスができなくなってしまいます。したがって、この操作は必ず行っておきましょう。セキュリティの観点から、GitHubは、過去1年間使用されていない個人アクセストークンは自動的に削除します。削除された場合は、再度作成する必要があります。

トークンの作成

1. GitHubのWebページにアクセスし、右上にあるプロフィールの画像をクリックします。

2. メニューからSettingsをクリックします。

3. 左サイドバーからDeveloper settingsをクリックします。

4. 続いて、左サイドバーからPersonal access tokensをクリックします。

5. Generete new tokenをクリックします。

6. 作成するトークンにわかりやすい名前をつけ、このトークンに付与するスコープとして、repogistを選択します。なお、選択したrepo は、このトークンを使用してコマンドラインからリポジトリにアクセスすることができる権限です。では、Generate token をクリックして実際に作成します。

7. 作成されたトークンをメモとして残しておき、忘れないようにしてください。メモを書き間違うことが心配な場合は、スクリーンショットを撮っておくと良いでしょう。

なお、この画面はセキュリティ上の理由で、別ページに移動すると、再度見ることができなくなるので、注意しておいてください。
今回作成したトークンは、ターミナルを使ってコマンドラインからGithubのリポジトリにアクセスする際にパスワードとして使用することになります。

GitHubへリポジトリを反映するための一連の流れ

GitHubへリポジトリを反映させるためには、下記の手順で実行しましょう。

  1. GitHubにリモートリポジトリを作成する
  2. ローカルリポジトリにリモートリポジトリを登録する
  3. ローカルリポジトリのブランチ名を変更する
  4. 登録したリモートリポジトリへプッシュする
  5. GitHubのリモートリポジトリにプッシュされたか確認する

GitHubにリモートリポジトリを作成する

first-gitという名前でGitHubにリモートリポジトリを作成して、公開しましょう。

まずはGitHubへアクセスし、ログインしてください。次に+ボタンから「New repository」をクリックしましょう。

GitHubへリモートリポジトリを作成します。「Repository name」にfirst-gitと入力して、「Create repository」をクリックしてください。

これでリモートリポジトリが作成されましたが、まだ中身は空っぽです。ローカルリポジトリをリモートリポジトリにもコピーして反映させるためにプッシュというコマンドが必要となります。まずはその準備のためにローカルリポジトリにリモートリポジトリを登録していきます。

ローカルリポジトリにリモートリポジトリを登録する

ローカルリポジトリにリモートリポジトリを登録するには、先ほどのキャプチャ内にあった下記のコマンドを実行します。

git remote add origin https://github.com/ユーザ名/first-git.git

このコマンドは、ローカルリポジトリにoriginという名前でリモートリポジトリ(ここではfirst-git.git)を登録するという意味です。ユーザ名には皆さんのGitHubでのユーザ名を入力してください。

これでローカルリポジトリにリモートリポジトリを登録できました。以降、このローカルリポジトリでは、originを使用してリモートリポジトリとやり取りを行うことができます。したがって、git remote add origin ...のコマンドは何度も実行する必要はありません。

リモートリポジトリの登録状況を確認したい場合は下記のコマンドで確認することができます。

git remote -v

ローカルリポジトリのブランチ名を変更する

次に、ローカルリポジトリのブランチ名をmasterからmainに変更します。これは、5.4 ブランチのデフォルトのブランチ名で解説したとおり、リモートリポジトリのデフォルトブランチ名(main)とローカルリポジトリのデフォルトブランチ名(master)が異なっているためです。

git branch -M main

上記コマンドを実行すると、これまで(master)とターミナルに表示されていましたが、(main)に変更されます。

Macの方の注意事項です

macOS キーチェーンからの認証情報を削除する必要があります

git credential-osxkeychain erase

下記は参考サイトです

https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/updating-credentials-from-the-macos-keychain

わかりにくければ、下記のほうが簡単に書かれてます

https://zenn.dev/hayata_yamamoto/articles/github-access-key

Laravel6でのログイン失敗回数オーバでロックさせるコーディング【Throttle機能】

Throttle機能とは

Throttle機能とは、ログイン失敗時に失敗した場合、一定の指定回数を超えた場合にログインにロックを掛けて、一定の時間を経過したらロックを解除する機能です。

Throttle機能を使う

実装方法は $maxAttemptsと$decayMinutesをLoginController内に設定するだけです。

<?phpclass LoginController extends Controller{    use AuthenticatesUsers;    protected $maxAttempts = 5; // 5回失敗したらロックする    protected $decayMinutes = 30; // ロックは30分間

ロックした時にメッセージを出すようにする

しかし、$maxAttemptsに設定された回数失敗したらロックされるのですが、ロックされた旨のメッセージは設定した回数失敗した際には表示されません。
ロックしたらその時に知らせてほしいものです。そこで、ロックしたメッセージがすぐに表示されるようにしてみます。

ロックのエラー処理は、loginメソッド内でやっています。 ログイン判定前に、処理をしているようなので、ログイン判定後に改めてロックの判定を行うように追記します。

<?php
    public function login(Request $request)    {
       $this->validateLogin($request);
       if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);
            return $this->sendLockoutResponse($request);
        }          if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        } 
        $this->incrementLoginAttempts($request);
         // このif文を追記
        if (method_exists($this, 'hasTooManyLoginAttempts') && $this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);
            return $this->sendLockoutResponse($request);
        }
          return $this->sendFailedLoginResponse($request);
    }

これでロックしたらすぐにメッセージが出るようになります。

失敗回数はログインID毎ではなく全体での回数にする

Laravelではログインの失敗のカウントは、ログインID毎に判別しているようです。
つまり、あるアカウントはロックされても、別のアカウントならログイン可能ということです。 これを全体で失敗した回数にしたいと思います。

throttleKeyというメソッドでログインを判別するためのキーを生成しているので、これをLoginController内でオーバーライドして修正します。

Str::lower($request->input($this->username())).’|’.$request->ip()となっていて、ログイン名(通常はemail)とIPを元にキーを生成しています。 このキーを元にカウントアップするので、アカウントごとに失敗した回数が設定されるというわけですね。

なので、ここを以下のように修正します。

    protected function throttleKey(Request $request)    {
        return $request->ip();
    }

これでアカウントは関係なく同一IPからの失敗でカウントされるようになります。

以上になります。参考にされてくださいね。