Hokma School :: Course 2 Laravel

Laravel 08. Authentication System

테디아저씨 2026. 4. 29. 16:54

 

 

@ 시간이 된다면 blade 에 @push @stack 설명할것.

 

Laravel은 기본적으로 회원, 로그인에 대한 정보를

  • users 테이블
  • User 모델
  • session 기반 로그인

으로 처리하고 있습니다.

 

기본으로 제공하는 컬럼은

  • name
  • email
  • password

 

 

인덱스페이지 

bootstrap 을 사용합니다. 

php artisan make:controller IndexController

 

 

resources/views/index.blade.php

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
  </head>
  <body>
    <div class="container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto">
        <div class="row">   
            <div class="col text-end">

                    <div class="">
                        Welcome Guest

                    </div> 

            </div>
        </div>
        <div class="row text-center mt-5">   
            <h1>
                Index Page
            </h1>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
  </body>
</html>

 

 

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class IndexController extends Controller
{
    /**
     * Handle the incoming request.
     */
    public function index(Request $request)
    {
        //
        return view('index');
    }
}

 

Register

 

example  https://getbootstrap.com/docs/5.3/forms/overview/

 

View

resources/views/member/register.blade.php

    <form method="post" action="{{ route('signup') }}" autocomplete="off">
        <div class="mb-3">
          <label for="name" class="form-label">Name</label>
          <input type="text" class="form-control" id="name" name="name">
        </div>
        <div class="mb-3">
          <label for="email" class="form-label">Email</label>
          <input type="email" class="form-control" id="email" name="email" aria-describedby="emailHelp">
        </div>
        <div class="mb-3">
          <label for="password" class="form-label">Password</label>
          <input type="password" class="form-control" id="password" name="password">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>

 

Controller

php artisan make:controller UserController

 

app/http/Controller/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
    public function signup_form(){
        return view('member.register');
    }
}

 

 

Route

 

routes/web.php

use App\Http\Controllers\UserController;

Route::get('/register', [UserController::class, 'signup_form'])->name('signup_form');
Route::post('/register', [UserController::class, 'signup'])->name('signup');

 

 

http://127.0.0.1:8000/register

 

 

Login

 

resources/views/member/login.blade.php

    <form method="post" action="{{ route('signin') }}" autocomplete="off">
        <div class="mb-3">
          <label for="email" class="form-label">Email</label>
          <input type="email" class="form-control" id="email" name="email" aria-describedby="emailHelp">
        </div>
        <div class="mb-3">
          <label for="password" class="form-label">Password</label>
          <input type="password" class="form-control" id="password" name="password">
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
      </form>

 

 

app/http/Controller/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    //
    public function signup_form(){
        return view('member.register');
    }


    public function signup_submit(Request $request) {

        // $request->validate([
        //     'name' => 'required|min:2|max:20',
        //     'email' => 'required|email',
        //     'password' => 'required|min:8',
        // ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        if($user) {
            return redirect()->route('login')->with('success', 'User created successfully');
        } else {
            return redirect()->route('register')->with('error', 'User creation failed');
        }

    }
}

 

 

routes/web.php

use App\Http\Controllers\UserController;

Route::get('/register', [UserController::class, 'signup_form'])->name('register');
Route::post('/register', [UserController::class, 'signup_submit'])->name('signup');

Route::get('/login', [UserController::class, 'login_form'])->name('login');
Route::post('/login', [UserController::class, 'login_submit'])->name('signin');


Route::get('/', [IndexController::class, 'index'])->name('index');

 

 

app/http/Controller/UserController.php

public function login_submit(Request $request){
    $request->validate([
        'email' => 'required|email',
        'password' => 'required|min:8',
    ]);

    $user = User::where('email', $request->email)->firstOrFail();
    if($user){


		//if(auth()->attempt([
        if(Auth::attempt([
            'email' => $request->email,
            'password' => $request->password
        ])){
            return redirect('/');
        }            

    } else {
        return redirect()->route('login')->with('error', 'Invalid email');
    }
 
}

 

 

or 

        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $request->session()->regenerate();
            return redirect()->intended('/');
        }

 

 

Status 

 

IndexController.php

        if(Auth::check()){
            $user = Auth::user();
        } else {
            $user = [];
        }
        return view('index', [
            'user' => isset($user) ? $user : null
        ]);

 

 

resources/views/index.blade.php

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
  </head>
  <body>
    <div class="container mt-5 col-lg-3 col-md-4 col-sm-12 mx-auto">
        <div class="row">   
            <div class="col text-end">
                @if(isset($user) && $user != null)
                    <div class="">Welcome {{ $user['name'] }} </div>
                @else
                    <div class="">Welcome Guest
                        <a href="{{ route('login') }}">Login </a>
                         |
                        <a href="{{ route('register') }}">Register </a>
                    </div>
                @endif
            </div>
        </div>
        <div class="row text-center">   
            <h1>
                Index Page
            </h1>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js" integrity="sha384-FKyoEForCGlyvwx9Hj09JcYn3nv7wiPVlz7YYwJrWVcXK/BmnVDxM+D2scQbITxI" crossorigin="anonymous"></script>
  </body>
</html>

 

 

logout

 

resources/views/index.blade.php

<div class="">Welcome {{ $user['name'] }}  <a href="{{ route('member.logout') }}" class="">Logout</a></div>

 

routes/web.php

Route::get('/logout', [UserController::class, 'logout'])->name('signout');

 

app/http/Controller/UserController.php

public function logout(Request $request){
    //Auth::logout();
    
    auth()->logout();
    $request->session()->invalidate();
    $request->session()->regenerateToken();
        
    return redirect()->route('index');
}

 

 

Middleware

“사용자의 요청이 컨트롤러에 도착하기 전에 중간에서 검사하는 기능”

 

이럴때 사용합니다.

 

  • 로그인 여부 확인
  • 관리자 권한 확인
  • API 토큰 확인
  • 로그 기록

 

 

Laravel 기본 middleware

 

auth

로그인한 사용자만 허용

Route::middleware('auth')->group(function () {
    Route::get('/dashboard');
});

 

** 만약 회원 로그인이 안되어 있다면

vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php

protected function redirectTo(Request $request): ?string
{
    return $request->expectsJson() ? null : route('login');
}

guest

로그인 안한 사용자만 허용

Route::middleware('guest')->group(function () {
    Route::get('/login');
});

 

 

사용자 미들웨어 생성

php artisan make:middleware AdminMiddleware

 

로그인여부

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  Closure(Request): (Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
    	//  your codes....
        if (!auth()->check()) {
            return redirect('/login');
        }
        
        return $next($request);
    }
}

 

 

관리자 확인

관리자구분을 위해서 type 컬럼을 하나 추가하고 기본은 9 가 입력되게 한다.

php artisan make:migration add_type_to_users

 

database/migrations/2026_xx_xx_xxxxxx_add_type_to_users.php

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->integer('type')->default(9)->comment('1: admin, 9: user');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            //
            $table->dropColumn('type');
        });
    }
};

 

php artisan migrate

 

** 관리자 계정만들기

1) admin 이라는 아이디로 가입합니다.

2) 나중에는 관리자가 user 의 type을 변경하는 기능을 만들기로 하고, 지금은 수동으로  type=1 로 변경한다.

 

****************************************

Middleware로 권한에 대한 처리를 하려고 하였지만, 

Gate라는 손쉬운 방법이 있어서 해당 기능을 사용하기로 합니다.

****************************************

Gate 를 이용하는 방법

Gate는 사용자에게 특정 작업을 수행할 권한이 있는지 확인하는 가장 빠르고 직관적인 방법

 

 

app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Gate;
use App\Models\User;

public function boot(): void
{
    // 'admin'이라는 이름의 게이트 정의
    Gate::define('admin-only', function (User $user) {
        return $user->type === 1; // true or false
    });
}

 

1) controller 를 이용하는 방법

Gate::authorize('admin-only');
// 이 한줄만으로 false 면 403 에러

 

2) route 를 이용하는 방법

Route::middleware('auth')->group(function () {
    Route::get('/admin', [AdminController::class, 'index'])->name('admin.index')->middleware('can:admin-only');
});

 

3) view 에서 이용방법

<div class="">Welcome {{ $user['name'] }} 
    @can('admin-only')
        <a href="{{ route('admin.index') }}" class="">Admin Index</span>
    @endcan 
	<a href="{{ route('signout') }}" class="">Logout</span>
</div>

 

사용자 MiddleWare 를 이용하는 방법

 

 


** 관리자여부

** 특정글에 권한

** 공통적인 처리 ( 로그출력등 )

 

 

 

php artisan make:middleware AdminMiddleware

 

AdminMiddleware

 

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;


class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  Closure(Request): (Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        // 관리자
        if ( !auth()->check() || auth()->user()->type != 1 ) {
            return redirect('/');
        }
        return $next($request);
    }
}

 

Laravel 10 이하에서는 app/Http/Kernel.php

이후에는 bootstrap/app.php 에 통합

 

bootstrap/app.php

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware): void {
        // 미들웨어 별칭 등록 (기존 routeMiddleware 역할)
        $middleware->alias([
            'admin' => \App\Http\Middleware\AdminMiddleware::class,
        ]);

    })
    ->withExceptions(function (Exceptions $exceptions): void {
        //
    })->create();

 

route/web.php

    Route::get('/admin', [AdminController::class, 'index'])->name('admin.index')->middleware('admin');

 

'Hokma School :: Course 2 Laravel' 카테고리의 다른 글

Laravel 07. Form / Validation + git clone laravel project  (0) 2026.04.28
Laravel 06. Eloquent ORM  (0) 2026.04.24
Laravel 04. Blade Templete  (0) 2026.04.13
Laravel 03. Controller  (0) 2026.04.13
Laravel 02. Routing  (1) 2026.04.10