4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravelで認証用の仕組みの作り方

4
Posted at

※自分用メモ

■Laravelで認証用の仕組みの作り方
※前提条件
・認証テーブルには最低下記のカラムが必要
login_id(名前は任意だがデフォルトはemail)
password(名前は任意だがデフォルトはpassword。保存時にbcryptで暗号化させないと認証できない。)
remember_token(プログラムの修正で消すことも可能!?)

		+して平パスワードを保存する場合カラムを追加
		password_raw(名前は任意)

	・ログイン画面のフォーム属性ユーザーID・パスワードのnameの値と認証用テーブルのユーザーID・パスワードのカラム名は同じにしないとエラーになる
		例:
			・ログイン画面フォーム属性
				ユーザーIDのname:login_id
				パスワードのname:password

			認証用テーブルusersのカラム
				ユーザーIDのカラム名:login_id
				パスワードのカラム名:password


・元になる認証の仕組みがある場合
	1.元になる認証用のディレクトリをコピーし複製を作成
		例:競馬サイトの場合
			コピー元:/data/www/jray/app/Http/Controllers/Auth
			コピー先:/data/www/jray/app/Http/Controllers/Agency/Auth

	2.認証用のMiddlewareをコピーし複製を作成
		例:競馬サイトの場合
			コピー元:/data/www/jray/app/Http/Middleware/MemberAuthToken.php
			コピー先:/data/www/jray/app/Http/Middleware/AgencyMemberAuthToken.php

	3.2で作成したMiddlewareをKernel.phpに登録する
		/data/www/jray/app/Http/Kernel.php
			例:競馬サイトの場合
				protected $routeMiddlewareの配列内、下記のように追加する
				'auth.token' => \App\Http\Middleware\MemberAuthToken::class,
				'auth.admin.token' => \App\Http\Middleware\MemberAuthToken::class,
				'auth.agency.token' => \App\Http\Middleware\AgencyMemberAuthToken::class,

			routes/web.php
			認証をかけたいルーティングを下記に書く
			Route::group(['middleware' => 'auth.agency.token'], function() {
				認証後ページのルーティングをここに書く
			});

	4.認証に使用するテーブルのModelを修正
		例:競馬サイトの場合
			/data/www/jray/app/Model/
			修正前:
				use Illuminate\Database\Eloquent\Model;

				class Agency extends Model{

			修正後:
				use Illuminate\Notifications\Notifiable;
				use Illuminate\Foundation\Auth\User as Authenticatable;

				class Agency extends Authenticatable {

	5.2で作成したファイル内のAuth::guard('user')部分を今回の認証用に合わせ、その他も今回に合わせて修正
		例:競馬サイトの場合
				修正前:Auth::guard('user')
				修正後:Auth::guard('agency')

	6.LoginController.phpを今回に合わせて修正
		下記のemailはログイン画面のユーザーIDのフォーム部分と認証用テーブルにあたるため、今回のに変更
		例:競馬サイトの場合
			ログイン画面のユーザーIDのフォームのname=login_id、認証用テーブルのユーザーIDのカラム名がlogin_idなら下記になる。
			passwordの部分も変更する場合は
			public function username()
			{
				return 'login_id';
			}

			下記も今回のに変更
			修正前:Auth::guard('user')
			修正後:Auth::guard('agency')
			protected function guard()
			{
				return Auth::guard('agency');
			}

	7.RegisterController.phpを今回に合わせて修正
	8.viewファイルもコピーし修正
	9.config/app.phpを修正
		例:競馬サイトの場合
		'guards' => [
			'user' => [
				'driver' => 'session',
				'provider' => 'user',
			],
			'admin' => [
				'driver' => 'session',
				'provider' => 'admin',
			],
			'agency' => [
				'driver' => 'session',
				'provider' => 'agency',
			],
		],

		'providers' => [
			'user' => [
				'driver' => 'eloquent',
				'model' => App\Model\User::class,
			],
			'admin' => [
				'driver' => 'eloquent',
				'model' => App\Model\Admin::class,
			],
			'agency' => [
				'driver' => 'eloquent',
				'model' => App\Model\Agency::class,
			],
		],

		'passwords' => [
			'user' => [
				'provider' => 'user',
				'table' => 'password_resets',
				'expire' => 129600,
			],
			'admin' => [
				'provider' => 'admin',
				'table' => 'password_resets',
				'expire' => 180,
			],
			'agency' => [
				'provider' => 'agency',
				'table' => 'password_resets',
				'expire' => 180,
			],
		],



・元になる認証の仕組みがない場合
	※参考URL:https://readouble.com/laravel/5.5/ja/authentication.html

	1.php artisan make:auth
		実行すると認証に必要なファイルが生成される
			resources/views/auth
			app/Http/Controllers/Auth
				RegisterController.php
				LoginController.php
				ForgotPasswordController.php
				ResetPasswordController.php

	2.必要に応じてLoginController.php内にメソッドをオーバーライドする
		修正が必要になる可能性のあるメソッド

		//AuthenticatesUsersのloginのメソッドをadmin用にオーバーライド
		public function login(Request $request)
		{
			$this->validateLogin($request);

			if ($this->hasTooManyLoginAttempts($request)) {
				$this->fireLockoutEvent($request);

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

			if ($this->attemptLogin($request)) {
				//ログ出力
				$this->log_obj->addLog(config('const.admin_display_list')['login'].",{$request->input('email')}");
				
				//ログイン成功時にホスト名とユーザーエージェントをadminsテーブルにupdate
				// add by nishizawa date 2017.9.13
				$update = Admin::where('email', $request->input('email'))
					->update([
						'access_host'		=> $_SERVER['SERVER_NAME'],
						'user_agent'		=> $_SERVER['HTTP_USER_AGENT'],
						'last_login_date'	=> Carbon::now(),
					]);
				
				return $this->sendLoginResponse($request);
			}

			$this->incrementLoginAttempts($request);

			return $this->sendFailedLoginResponse($request);
		}
		
		//AuthenticatesUsersのvalidateLoginのメソッドをadmin用にオーバーライド
		protected function validateLogin(Request $request)
		{
			$this->validate($request, [
				$this->username() => 'bail|required|string|exists:admins|check_approved',
				'password' => 'bail|required|string',
			]);
		}
		
		//AuthenticatesUsersのcredentialsのメソッドをadmin用にオーバーライド
		protected function credentials(Request $request)
		{
			//オリジナルコード
			return $request->only($this->username(), 'password');
		}

		//AuthenticatesUsersのcredentialsのメソッドをadmin用にオーバーライド
		public function logout()
		{
			$user = Utility::getAdminDefaultDispParam();

			//情報が取得できていなかったら(セッションが切れていたら)
			if( empty($user) ){
				//管理画面のログイン前ページへリダイレクト
				return redirect('/admin/login');
			}

			//ログ出力
			$this->log_obj->addLog(config('const.admin_display_list')['logout'].",{$user['login_id']}");

			//セッションを破棄(検索条件)
			Session::flush();

			$this->guard()->logout();

			//管理画面のログイン前ページへリダイレクト
			return redirect('/admin/login');
		}

		//AuthenticatesUsersのcredentialsのメソッドをadmin用にオーバーライド
		protected function guard()
		{
			return Auth::guard('admin');
		}

		//AuthenticatesUsersのcredentialsのメソッドをadmin用にオーバーライド
		//return 'email'の部分がログイン画面のユーザーIDのフォーム名、認証用テーブルのユーザーIDにあたるカラム名になっている
		public function username()
		{
			return 'email';
		}

	3.2と同様に必要があれば下記のファイルを修正
			app/Http/Controllers/Auth
				RegisterController.php
				ForgotPasswordController.php
				ResetPasswordController.php

	4.config/app.phpを修正
		例:競馬サイトの場合
		'guards' => [
			//ユーザー側
			'user' => [
				'driver' => 'session',
				'provider' => 'user',
			],
			//管理側
			'admin' => [
				'driver' => 'session',
				'provider' => 'admin',
			],
			//代理店管理側
			'agency' => [
				'driver' => 'session',
				'provider' => 'agency',
			],
		],

		'providers' => [
			'user' => [
				'driver' => 'eloquent',
				'model' => App\Model\User::class,
			],
			'admin' => [
				'driver' => 'eloquent',
				'model' => App\Model\Admin::class,
			],
			'agency' => [
				'driver' => 'eloquent',
				'model' => App\Model\Agency::class,
			],
		],

		'passwords' => [
			'user' => [
				'provider' => 'user',
				'table' => 'password_resets',
				'expire' => 129600,
			],
			'admin' => [
				'provider' => 'admin',
				'table' => 'password_resets',
				'expire' => 180,
			],
			'agency' => [
				'provider' => 'agency',
				'table' => 'password_resets',
				'expire' => 180,
			],
		],
4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?