명색이 관리자 화면인데, 아무나 들어와서 조작하면 안되겠지요? 이제는 마지막으로 로그인/로그아웃 처리를 해보겠습니다. 로그인/로그아웃은 세션을 이용해서 구현합니다.

 

1. 로그인 화면을 구성합니다. xyz/resources/views/mgmt/index.blade.php 을 작성합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
 
<div class="container" style="margin-top: 20px">
  <form action="/mgmt/login" method="post" class="form-horizontal" style="margin: 0 auto; max-width: 360px;">
    @csrf
    <div class="form-group">
      <label for="userid" class="col-sm-3 control-label">아이디</label>
      <div class="col-sm-9">
        <input type="text" id="userid" name="userid" class="form-control" placeholder="당신의 ID를 입력하세요..." required autofocus>
      </div>
    </div>
    <div class="form-group">
      <label for="passwd" class="col-sm-3 control-label">비밀번호</label>
      <div class="col-sm-9">
        <input type="password" id="passwd" name="passwd" class="form-control" placeholder="비밀번호를 입력하세요..." required>
      </div>
    </div>
    <input type="submit" class="btn btn-primary btn-block" value="로그인" />
  </form>
</div>
 
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>

 

2. xyz/app/Http/Controllers/Mgmt/Main.php 를 생성합니다.

<?php
 
namespace App\Http\Controllers\Mgmt;
 
use App\Http\Controllers\Controller;
 
class Main extends Controller
{
    public function index()
    {
        return view('mgmt.index');
    }
}

 

3. xyz/routes/web.php 다음을 추가합니다.

...
use App\Http\Controllers\Mgmt\Main as MgmtMain;
...
  Route::get('/', [MgmtMain::class, 'index']);
...

 

4. http://xyz.test.com/mgmt 에 접속하면 로그인화면이 나올 것입니다.

 

5. MySQL Function 작성할 수 있도록 설정 변경

$ sudo mysql -u root
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
mysql> exit
$

 

6. MySQL에서 isMember Function 생성

$ mysql -u xyz -pxyz123 xyz
DELIMITER $$
CREATE FUNCTION isMember (
  i_userid VARCHAR(255),
  i_password VARCHAR(255)
) RETURNS INT
BEGIN
  DECLARE CNT INT;
 
  SELECT COUNT(*) INTO CNT FROM admins 
  WHERE userid = i_userid AND password = SHA2(i_password, 256);
   
  RETURN CNT;
END $$
DELIMITER ;

현재 Admin 목록 확인

mysql> CALL listAdmins();
+-----+---------+------------------------------------------------------------------+-------+
| sno | userid  | password                                                         | nick  |
+-----+---------+------------------------------------------------------------------+-------+
|  10 | userid1 | 3b1d7e9a7c37141350fb473fa099b8b18030cde1909f363e3758e52d4ea1a7b4 | nick1 |
|  11 | userid2 | 5a7d362627a891441ee34012b087915f03a6958c1062fe4cf01de24abecee053 | nick2 |
|  12 | userid3 | 44f1471b4598a6f5577221f7caf011743343b8b3b29c9675738cd225055563b7 | nick3 |
|  13 | userid4 | 34344e4d60c2b6d639b7bd22e18f2b0b91bc34bf0ac5f9952744435093cfb4e6 | nick4 |
+-----+---------+------------------------------------------------------------------+-------+

isMember Function 테스트

mysql> SELECT isMember('userid1', 'passwd1');
+--------------------------------+
| isMember('userid1', 'passwd1') |
+--------------------------------+
|                              1 |
+--------------------------------+
1 ROW IN SET (0.00 sec)
 
mysql> SELECT isMember('userid1', 'password2');
+----------------------------------+
| isMember('userid1', 'password2') |
+----------------------------------+
|                                0 |
+----------------------------------+
1 ROW IN SET (0.00 sec)
 
mysql>

 

7. xyz/app/Http/Controllers/Mgmt/Main.php 에 다음을 추가한다.

...
 
use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
 
...
 
    // 로그인
    public function login (Request $request) {
        $userid = $request->input('userid');
        $passwd = $request->input('passwd');
 
        $result = collect(DB::select('SELECT isMember(?, ?) as is_member', [$userid, $passwd]))->first();
 
        if ($result->is_member == 1) {
            $request->session()->put('mgmt-login', true);
            return redirect('/mgmt/admin');
        }
        return redirect('/mgmt');
    }
 
 
...

 

8. xyz/routes/web.php 에 다음을 추가한다.

...
 
    Route::post('/login', [MgmtMain::class, 'login']);
 
...

 

9. xyz/resources/views/mgmt/admin$/index.blade.php 에 다음을 적당한 곳에 추가한다.

...
 
<a href="/mgmt/logout">[로그아웃]</a>
 
...

 

10. xyz/app/Http/Controllers/Mgmt/Main.php 에 다음을 추가한다.

...
 
    // 로그아웃
    public function logout (Request $request) {
        $request->session()->forget('mgmt-login');
        return redirect('/mgmt');
    }
 
 
...

 

11. xyz/routes/web.php 에 다음을 추가한다.

...
 
    Route::get('/logout', [MgmtMain::class, 'logout']);
 
...

이제, 로그인도 해보고, 로그아웃도 해보세요. ^^

 

12. AuthMgmt 미들웨어를 생성한다.

$ cd xyz
$ php artisan make:middleware AuthMgmt
Middleware created successfully.
$

 

13. xyz/app/Http/Middleware/AuthMgmt.php 내용은 아래와 같이 작성한다.

<?php
 
namespace App\Http\Middleware;
 
use Closure;
use Illuminate\Http\Request;
 
class AuthMgmt
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $mgmt_login = $request->session()->get('mgmt-login');
        if ($mgmt_login != true) {
              return redirect('/mgmt');
        }
        return $next($request);
    }
}

 

14. xyz/app/Http/Kernel.php 에 AuthMgmt 를 등록한다.

...
 
    protected $routeMiddleware = [
...
        'auth.mgmt' => \App\Http\Middleware\AuthMgmt::class,
...
    ];
 
...

 

15. xyz/routes/web.php 파일을 아래처럼 수정한다.

<?php
 
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Main;
use App\Http\Controllers\Mgmt\Main as MgmtMain;
use App\Http\Controllers\Mgmt\Admin;
 
Route::get('/', [Main::class, 'index']);
 
Route::prefix('mgmt')->group(function () {
    Route::get('/', [MgmtMain::class, 'index']);
    Route::post('/login', [MgmtMain::class, 'login']);
    Route::get('/logout', [MgmtMain::class, 'logout']);
});
 
Route::prefix('mgmt')->middleware('auth.mgmt')->group(function () {
    Route::get('admin', [Admin::class, 'index']);
    Route::get('admin/insert_form', [Admin::class, 'insert_form']);
    Route::post('admin/insert', [Admin::class, 'insert']);
    Route::get('admin/chg_passwd_form/{id}', [Admin::class, 'chg_passwd_form']);
    Route::post('admin/chg_passwd', [Admin::class, 'chg_passwd']);
    Route::get('admin/update_form/{id}', [Admin::class, 'update_form']);
    Route::post('admin/update', [Admin::class, 'update']);
    Route::get('admin/delete/{id}', [Admin::class, 'delete']);
});

 

16. 여기까지 작성하면, 로그인해야만 http://xyz.test.com/mgmt/admin 을 접근할 수 있게 된다.

views.py 에서 세션을 참조하려면, 아래와 같이 사용하지만, Template 에서는 같은 문법을 사용할 수 없다.

request.session['세션이름'] = '값'

Template에서 Session을 이용하는 방법을 알아보자. settings.py 에 다음을 추가한다.

TEMPLATE_CONTEXT_PROCESSORS = (     'django.core.context_processors.request', )


views.py 에서는 render 함수를 이용해서 리턴한다.

return render(request, 'session_test.html')


Template에서는 아래와 같이 사용한다.

{{ request.session.세션이름 }}

 

+ Recent posts