Laavel Authenticate 다중 인증 프로세스 추적

7273 단어 Laravelauthentication

Laavel 인증 프로세스 추적


지금까지는 이해가 안 되고 다른 기사를 모방해서 왔어요. 잘 이해하기 위해 인증 절차를 추적해 봤어요
초보자이기 때문에 많은 착오가 있을 수 있으니 가르쳐 주시면 좋겠습니다

web.php

* 認証前ログイン画面
Route::get('admin/login','Admin\LoginController@showLoginForm')->name('show_admin_login_form');
Route::post('admin/login','Admin\LoginController@login')->name('admin_login');

* 認証後
Route::group(['middleware' => 'auth:admin'], function () {
    Route::get('admin/top/{id}', 'ItemController@top')->name('admin_top');
});
Kernel'middleware' => 'auth:admin'.54줄 근처에 있어요.
 protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,

App\Http\Middleware\Authenticate


39줄 정도의handle 방법이 실행됨
public function handle($request, Closure $next, ...$guards)
    {
        $this->authenticate($request, $guards);
        return $next($request);
    }
$request = array () $guards = array (0 => 'brand')네.
이어서 $this->authenticatehandle 방법에서의authicate 방법
 protected function authenticate($request, array $guards)
    {
        if (empty($guards)) {
            $guards = [null];
        }

        foreach ($guards as $guard) {

            if ($this->auth->guard($guard)->check()) {

              return $this->auth->shouldUse($guard);
            }
        }

        throw new AuthenticationException(
            'Unauthenticated.', $guards, $this->redirectTo($request)
        );
    }
$guards에 0 => 'brand', 와 배열이 있기 때문에foreach에서 $guard = brand if문에 사용합니다.$this->auth Illuminate\Auth\AuthManager입니다. AuthManager에 문의하십시오.

Illuminate\Auth\AuthManager

if ($this->auth->guard($guard)->check())를 통해AuthManeger에 대한gurd 방법
 public function guard($name = null)
    {
        $name = $name ?: $this->getDefaultDriver();

        return $this->guards[$name] ?? $this->guards[$name] = $this->resolve($name);
    }
$name = $name ?: $this->getDefaultDriver();

↓ 

if($name) {
$name = $name
} else {
 $this->getDefaultDriver()
};

null이니까 else.
getDefaultDriver 방법
 public function getDefaultDriver()
    {
        return $this->app['config']['auth.defaults.guard'];
    }

config 디렉터리의auth입니다.php 파일
    'defaults' => [
        'guard' => 'user',
        'passwords' => 'users',
    ],
왜냐하면defaults의guard는 "user"입니다.
AuthManage로 돌아가기
 public function guard($name = null)
    {
        $name = $name ?: $this->getDefaultDriver();

        return $this->guards[$name] ?? $this->guards[$name] = $this->resolve($name);
    }
return $this->guards[$name] ?? $this->guards[$name] = $this->resolve($name);

↓ 

?? は $this->guards[$name]がなければその処理をスキップして
次の$this->guards[$name] = $this->resolve($name)へ

protected $guards = [];없으니까this->guards[$name],그래서??이후$this->guards[$name] = $this->resolve($name)메서드
protected function resolve($name)
    {
        $config = $this->getConfig($name);

        if (is_null($config)) {
            throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");
        }

        if (isset($this->customCreators[$config['driver']])) {
            return $this->callCustomCreator($name, $config);
        }

        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';

        if (method_exists($this, $driverMethod)) {
            return $this->{$driverMethod}($name, $config);
        }

        throw new InvalidArgumentException(
            "Auth driver [{$config['driver']}] for guard [{$name}] is not defined."
        );
    }
$config = $this->getConfig($name);에서 다음 getConfig 방법의 반환값으로 배열을 수신합니다.$config = array (
'driver' => 'session',
'provider' => 'admins',
)
$name = admin
    protected function getConfig($name)
    {
        return $this->app['config']["auth.guards.{$name}"];
    }


** configディレクトリー auth.php

    'guards' => [
        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],
if (method_exists($this, $driverMethod))에method가 있기 때문에auth.특정 php의 어떤 물체?되돌아오다
App\Http\Middleware\Authenticate
왜냐하면 지금까지 이 포에치 내의 두 가지 언어를 하고 있었거든요.
이 두 언어는 AuthManager에서 되돌아옵니다 $this->guards[$name] = $this->resolve($name
 protected function authenticate($request, array $guards)
    {
        if (empty($guards)) {
            $guards = [null];
        }

        foreach ($guards as $guard) {

            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }
        }

        throw new AuthenticationException(
            'Unauthenticated.', $guards, $this->redirectTo($request)
        );
    }
if에 로그인하지 않았기 때문에 check 방법의 반환값은 $this->user는null입니다. throw new AuthenticationException 에서 RedirectTo 방법이 기술한 곳으로 이동합니다.
protected function redirectTo($request)
{
    if (! $request->expectsJson()) {
        if ($request->path() === 'home') {
            return route('login');
        } elseif ($request->path() === 'admin/home') {
            return route('show_admin_login_form');
        }
    }
}

`Route::post('login',    'Admin\LoginController@login')->name('admin.login');`
AdminController의 login(AuthenticatesUsers의 login)
    public function login(Request $request)
    {
        $this->validateLogin($request);

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

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

        if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        }

          $this->incrementLoginAttempts($request);

        return $this->sendFailedLoginResponse($request);
    }
$this->validateLogin($request);에 필요한 문자 수 등이 일치하는지 확인if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
Login 을 내보냅니다.

좋은 웹페이지 즐겨찾기