Site icon PlusMagi's Blog By Pitt Phunsanit

Laravel: authenticate users without Database

ต้องการเขียนระบบ login ง่าย ๆ โดยไม่ใช้ database ในการเก็บ username และ password ในการ login

เริ่มด้วยการแก้ LoginController  ให้ใช้เงื่อนไขใหม่แทนการดึงข้อมูลจากตาราง users

<?php

namespace App\Http\Controllers\Auth;

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

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 = RouteServiceProvider::HOME;

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

 /* custom */

 // \vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php

 /**
  * Handle a login request to the application.
  *
  * @param \Illuminate\Http\Request $request
  * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response|\Illuminate\Http\JsonResponse
  *
  * @throws \Illuminate\Validation\ValidationException
  */
 public function login(Request $request)
 {

  Log::debug('login ' . $request->input('username') . ' == ' . env('LOGIN_USERNAME') . ' && ' . $request->input('password') . ' == ' . env('LOGIN_PASSWORD'));

  if ($request->input('password') === env('LOGIN_PASSWORD') && $request->input('username') === env('LOGIN_USERNAME')) {
   $request->session()->put('authenticated', time());
   return redirect()->intended('home');
  }

  return view('auth.login', [
   'message' => 'Provided PIN is invalid. ',
  ]);
 }

}

เพิ่ม config ที่เก็บรหัสไว้ในไฟล์ .env เช่น

LOGIN_PASSWORD=phunsanit
LOGIN_USERNAME=pitt

จากนั้นเขียน Middleware มาเช็คว่า session ใน function login มีหรือเปล่า ถ้ามีก็ให้ผ่าน ไม่มีก็ให้ไปหน้า login

<?php

namespace App\Http\Middleware;

use Closure;

class AuthenticateWithSession
{
 /**
  * Handle an incoming request.
  *
  * @param \Illuminate\Http\Request $request
  * @param \Closure $next
  * @return mixed
  */
 public function handle($request, Closure $next)
 {
  if (!empty(session('authenticated'))) {
   $request->session()->put('authenticated', time());
   return $next($request);
  }

  return redirect('/login');
 }
}

จากนั้นก็เลือก routes ที่จะใช้ middleware ที่เขียนขึ้นมาใหม่ โดยเปิดไฟล์ \routes\web.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
 */
/*
Route::get('/', function () {
return view('welcome');
});

Route::get('/home', 'HomeController@index')->name('home');
 */

Auth::routes();
Route::group(['middleware' => ['web', 'AuthenticateWithSession']], function () {
...
 Route::get('/home', 'HomeController@index')->name('home');
...
});

จากนั้นแนะนำให้ laravel รู้จัก middleware ที่สร้างขึ้นมาใหม่ โดยเปิดไฟล์ \app\Http\Kernel.php และเพิ่ม

 protected $routeMiddleware = [
...

  /* custom */
  'AuthenticateWithSession' => \App\Http\Middleware\AuthenticateWithSession::class,
...
 ];
Exit mobile version