반응형

대부분의 프로젝트는 무에서 유를 만드는게 아니라 기존에 있던 서비스를 업그레이드 하거나 차세대로 가거나 하는 경우가 대부분이다. 그래서 라라벨을 적용할때도 기존에 사용하던 회원 테이블을 그대로 가져다 써야 하는 경우가 있다.

 

그런데 이게 왜 문제가 되냐하면 라라벨에 있는 Auth에서 사용하는 비밀번호 암호화가 일반적인 SHA512가 아니라는 점이다.

 

그래서 기존에 회원 테이블에 있는 정보를 가지고는 라라벨의 Auth를 이용해서 로그인을 할 수 가 없다. 하지만 회원들한테 비밀번호를 알려달라고 해서 마이그레이션을 할수도 없는 노릇이니 이런 경우에 어떻게 해야할까?

 

답은 정해져 있다. 라라벨 Auth의 암호화를 SHA512로 바꾸면 된다. 하지만 그것도 쉽지 않아서 바꾸는게 아니고 피해간다고 보는 것이 맞을 것이다.

 

우선 기존 사용하던 member 테이블을 라라벨에 모델로 등록한다.

 

$php artisan generate:modelfromtable --table=member

 

그러면 아래와 같이 모델 파일이 생성된다.

 

/app/Models/Member.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;
 
class Member extends Model
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'member';

 

대충 이렇게 만들어 진다. 아래 부분은 잘랐다. 

 

그다음에 이제 이 Member.php를 auth에서 사용하겠다고 config를 수정해야 한다.

 

/config/auth.php

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

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

 

위와 같이 model부분을 User에서 Member로 수정해준다.

 

그리고 로그인을 처리할 컨트롤러를 만든다. 명령어로 만들거나 기존 다른 컨트롤러를 가져와서 만들어도 된다.

 

/app/Http/Controllers/LoginController.php

<?php

namespace App\Http\Controllers;
use App\Models\Member;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Log;

class LoginController extends Controller
{

    public function index(){
        return view('login');
    }

    public function login(Request $request){
        $email = $request->email;
        $passwd = $request->passwd;
        //$passwd = Hash::make($passwd);
        $passwd = hash('sha512',$passwd);
        $remember = $request->remember;
        $loginInfo = array(
            'email' => $email,
            'passwd' => $passwd
        );
        //$ismember=Member::where($loginInfo)->exists();
        $ismember = Member::where($loginInfo)->first();
        //print_r($ismember);
        if($ismember){
            Auth::login($ismember, $remember);
            return redirect() -> route('boards.index');
        }else{
            return redirect() -> route('auth.login');
        }
    }

    public function logout(){
        auth() -> logout();
        return redirect() -> route('boards.index');
    }
}

 

login 부분을 잘 보자. Hash를 이용해서 하는건 라라벨 방식이지만 기존 member 테이블이 SHA512로 돼 있으니 의미가 없다. 그래서 비밀번호를 받아서 sha512로 바꾸어 준다.

 

그리고 기존 member 테이블에서 비밀번호 컬럼이 passwd이기때문에 이렇게 해 주었다. 보통 라라벨에서는 password로 돼 있다.

 

참고로 remember 기능을 사용하려면 member 테이블에 remember_token 컬럼을 추가해 주어야 한다.(컬럼 한개 정돈 추가할 수 있자나)

 

$ismember 변수에 값이 있으면  Auth에 담아서 로그인 처리를 해준다. 그러나 이렇게 하면 오류가 난다. 한가지 더 수정해야 한다. member 모델을 수정해야 한다.

 

/app/Models/Member.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Hash;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Member extends Authenticatable
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'member';

 

이렇게 Authenticatable 로 바꾸어 주어야 한다.

 

이제 다시 해보면 로그인 처리가 될 것이다.

 

이번엔 사용자 화면에서 로그인 처리를 해보자.

 

        @guest()
            <a href="{{route('auth.login')}}" class="text-xl">로그인</a>
        @endguest
        @auth()
            <form action="/logout" method="post" class="inline-block">
                @csrf
                <span class="text-xl text-blue-500">{{auth()->user()->email}}</span> /
                <a href="{{route('auth.logout')}}"><button class="text-xl">로그아웃</button></a>
            </form>
        @endauth

  

이렇게 로그인했으면 이메일과 로그아웃 버튼을 보여주고 로그인을 안했으면 로그인 버튼을 보이도록 해주었다.

 

라라벨을 하다보면 이게 php가 맞나라는 생각이 자꾸 든다. 그래도 재미는 있다...쿨럭...

반응형

+ Recent posts