Laravel5.4에서 여러 계정 기능에 대해 각각 인증
18852 단어 laravel5.4
회원제 사이트를 구축하다.
흔한 회원 계정이 사용하는 페이지와 달리 사업자만 이용할 수 있는 관리 화면이 필요하다.
다르긴 하지만 데이터베이스 같은 건 똑같은데... 같은 애플리케이션에 편입하고 싶네요.
그때는 라벨5였어.소문의 다중 인증 기능을 사용하면 2 이상으로 해결된다.
이번에는 라벨 5.4로 해봤어요.
화면 관리 요건
설치 방법
인증 보호 설정
인증을 어떻게 하는지에 대한 보호 설정이 있습니다.
이 보호에서 관리자에게 인증 보호를 추가합니다.
App Models\Admin 클래스를 사용하는 공급업체에 대한 추가 보호 기능이 추가되었습니다.
이것은 config/auth입니다.php에 추가합니다.
config/auth.phpreturn [
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
// adminガードを追加
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
// プロバイダー設定
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// adminsプロバイダーを追加
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
];
중간부품
--추기 2017.12.12
5.5의 코드를 보고 예외 처리를 받은 곳에서 방향을 바꾸는 것을 발견했다.
아마 5.4도 마찬가지일 것이다. 예외 처리로 처리하면 이 중간부품은 대응할 필요가 없다.
창설
추가된 보호 설정을 통해 인증 판정을 하는 중간부품을 만듭니다.
Auth fade 지정 보호에서 인증 판정을 받을 수 있습니다.Auth::guard(string)->check()
방법으로 판정할 수 있다.
판정 결과가 인증되지 않은 상태라면 관리 화면의 로그인 화면으로 다시 지정합니다.
이렇게 하면 화면 관리 전용 인증 중간부품을 실현할 수 있다.
app/Http/Middleware/AuthenticateAdmin.phpnamespace App\Http\Middleware;
use Closure;
use Auth;
/**
* 管理画面認証ミドルウェア
*/
class AuthenticateAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function hanlde($request, Closure $next)
{
// adminアカウントの認証がなければ管理画面ログインフォーム画面へリダイレクト
if (Auth::guard('admin')->check() === false) {
return redirect()->route('admin.login');
}
return $next($request);
}
}
등록!
생성된 중간부품은 Kernel 레벨의 $routeMiddleware 속성에 추가됩니다.
app\Http\Kernel.phpnamespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
//他は省略
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.admin' => \App\Http\Middleware\AuthenticateAdmin::class, // 追加
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}
모델 생성하기
뭐, 처음엔 만들어도 좋았는데
Illuminate\Fundation\Auth\User를 상속하는 모델을 생성하는 경우 인증 기능에 사용할 수 있습니다.
다시 쓰는 방법을 통해 사용자 정의를 할 수 있습니다.
예를 들어 비밀번호 보존란이password가 아니라passwd인 경우를 기재했다.
만약에?산열되지 않았지만 산열되지 않은 명문으로 저장된 DB를 활용한 경우 \Hash::make($this->passwd)
를 getAuthPassword()
방법의 반환값으로 사용하면 대응할 수 있다.
뭐, 그런 일은 없겠지
App\Models\Adminnamespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
/**
* 管理者アカウントモデル
*/
class Admin extends Authenticatable
{
/**
* パスワード情報をカスタマイズ
* @return string
*/
public function getAuthPassword()
{
return $this->passwd;
}
}
라우팅 설정
이렇게 준비됐습니다. 이번에 제작한 중간부품으로 루트를 만들면 OK
routes/web.php// ===== 会員ページ =====
Route::group(['namespace' => 'Member', 'prefix' => 'member', 'as' => 'member.'], function() {
// ----- ログインページ -----
Route::group(['namespace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 認証が必要な会員ページ -----
Route::group(['middleware' => 'auth'], function() {
Route::get('/', 'HomeController@index')->name('index');
});
});
// ===== 管理画面のルーティング =====
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'admin.'], function() {
// ----- ログインページ -----
Route::group(['namepsace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 管理画面の認証が必要なページ -----
// ミドルウェア作成ではなく例外処理で対応の場合は ['middleware' => 'auth:admin'] にする
Route::group(['middleware' => 'auth.admin'], function() {
Route::get('/', 'DashboardController@index')->name('index');
});
});
예외 처리(2017.12.12 보충)
전용 중간부품 제작이 아니라 예외 처리에 대응하는 상황에서 실시
auth 중간부품의 경로에 접근할 때
비인증 상태인 경우 Illuminate\Auth\Authentication Exception을 던질 수 있습니다.
버림받은 예외는 앱 Exceptions\Handler 클래스가 이어받아 unautinticated 방법으로 불린다.
따라서 여기서 조금만 공예를 하면 인증 보호에 따라 목적지를 분리하여 다시 정할 수 있다.
보호의 종류를 어떻게 판정하는지는 두 번째 파라미터에 건네주는 exception에서 얻을 수 있습니다.
보호 참조 문서 가져오기
https://qiita.com/sawadashota/items/7921b0c9ac622965d7df
app/Exceptions/Handler.phpnamespace App\Exceptions;
use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
// 他のメソッドは省略
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error'=> 'Unauthenticated.'], 401);
}
// ここから先を変更する
// ガードを増やした場合はここのケースに追加していく
switch($exception->guard()[0]) {
case 'admin':
return redirect()->guest(route('admin.login'));
break;
default:
return redirect()->guest(route('member.login'));
break;
}
}
}
Reference
이 문제에 관하여(Laravel5.4에서 여러 계정 기능에 대해 각각 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ll_kuma_ll/items/1415f57c76c534fa2a5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
return [
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
// adminガードを追加
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
// プロバイダー設定
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
// adminsプロバイダーを追加
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
];
namespace App\Http\Middleware;
use Closure;
use Auth;
/**
* 管理画面認証ミドルウェア
*/
class AuthenticateAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function hanlde($request, Closure $next)
{
// adminアカウントの認証がなければ管理画面ログインフォーム画面へリダイレクト
if (Auth::guard('admin')->check() === false) {
return redirect()->route('admin.login');
}
return $next($request);
}
}
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
//他は省略
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'auth.admin' => \App\Http\Middleware\AuthenticateAdmin::class, // 追加
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}
뭐, 처음엔 만들어도 좋았는데
Illuminate\Fundation\Auth\User를 상속하는 모델을 생성하는 경우 인증 기능에 사용할 수 있습니다.
다시 쓰는 방법을 통해 사용자 정의를 할 수 있습니다.
예를 들어 비밀번호 보존란이password가 아니라passwd인 경우를 기재했다.
만약에?산열되지 않았지만 산열되지 않은 명문으로 저장된 DB를 활용한 경우
\Hash::make($this->passwd)
를 getAuthPassword()
방법의 반환값으로 사용하면 대응할 수 있다.뭐, 그런 일은 없겠지
App\Models\Admin
namespace App\Models;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
/**
* 管理者アカウントモデル
*/
class Admin extends Authenticatable
{
/**
* パスワード情報をカスタマイズ
* @return string
*/
public function getAuthPassword()
{
return $this->passwd;
}
}
라우팅 설정
이렇게 준비됐습니다. 이번에 제작한 중간부품으로 루트를 만들면 OK
routes/web.php// ===== 会員ページ =====
Route::group(['namespace' => 'Member', 'prefix' => 'member', 'as' => 'member.'], function() {
// ----- ログインページ -----
Route::group(['namespace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 認証が必要な会員ページ -----
Route::group(['middleware' => 'auth'], function() {
Route::get('/', 'HomeController@index')->name('index');
});
});
// ===== 管理画面のルーティング =====
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'admin.'], function() {
// ----- ログインページ -----
Route::group(['namepsace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 管理画面の認証が必要なページ -----
// ミドルウェア作成ではなく例外処理で対応の場合は ['middleware' => 'auth:admin'] にする
Route::group(['middleware' => 'auth.admin'], function() {
Route::get('/', 'DashboardController@index')->name('index');
});
});
예외 처리(2017.12.12 보충)
전용 중간부품 제작이 아니라 예외 처리에 대응하는 상황에서 실시
auth 중간부품의 경로에 접근할 때
비인증 상태인 경우 Illuminate\Auth\Authentication Exception을 던질 수 있습니다.
버림받은 예외는 앱 Exceptions\Handler 클래스가 이어받아 unautinticated 방법으로 불린다.
따라서 여기서 조금만 공예를 하면 인증 보호에 따라 목적지를 분리하여 다시 정할 수 있다.
보호의 종류를 어떻게 판정하는지는 두 번째 파라미터에 건네주는 exception에서 얻을 수 있습니다.
보호 참조 문서 가져오기
https://qiita.com/sawadashota/items/7921b0c9ac622965d7df
app/Exceptions/Handler.phpnamespace App\Exceptions;
use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
// 他のメソッドは省略
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error'=> 'Unauthenticated.'], 401);
}
// ここから先を変更する
// ガードを増やした場合はここのケースに追加していく
switch($exception->guard()[0]) {
case 'admin':
return redirect()->guest(route('admin.login'));
break;
default:
return redirect()->guest(route('member.login'));
break;
}
}
}
Reference
이 문제에 관하여(Laravel5.4에서 여러 계정 기능에 대해 각각 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ll_kuma_ll/items/1415f57c76c534fa2a5f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// ===== 会員ページ =====
Route::group(['namespace' => 'Member', 'prefix' => 'member', 'as' => 'member.'], function() {
// ----- ログインページ -----
Route::group(['namespace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 認証が必要な会員ページ -----
Route::group(['middleware' => 'auth'], function() {
Route::get('/', 'HomeController@index')->name('index');
});
});
// ===== 管理画面のルーティング =====
Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'as' => 'admin.'], function() {
// ----- ログインページ -----
Route::group(['namepsace' => 'Auth'], function() {
Route::get('login', 'LoginController@showLoginForm')->name('login');
Route::post('login', 'LoginController@login')->name('login.post');
});
// ----- 管理画面の認証が必要なページ -----
// ミドルウェア作成ではなく例外処理で対応の場合は ['middleware' => 'auth:admin'] にする
Route::group(['middleware' => 'auth.admin'], function() {
Route::get('/', 'DashboardController@index')->name('index');
});
});
전용 중간부품 제작이 아니라 예외 처리에 대응하는 상황에서 실시
auth 중간부품의 경로에 접근할 때
비인증 상태인 경우 Illuminate\Auth\Authentication Exception을 던질 수 있습니다.
버림받은 예외는 앱 Exceptions\Handler 클래스가 이어받아 unautinticated 방법으로 불린다.
따라서 여기서 조금만 공예를 하면 인증 보호에 따라 목적지를 분리하여 다시 정할 수 있다.
보호의 종류를 어떻게 판정하는지는 두 번째 파라미터에 건네주는 exception에서 얻을 수 있습니다.
보호 참조 문서 가져오기
https://qiita.com/sawadashota/items/7921b0c9ac622965d7df
app/Exceptions/Handler.php
namespace App\Exceptions;
use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
class Handler extends ExceptionHandler
{
// 他のメソッドは省略
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error'=> 'Unauthenticated.'], 401);
}
// ここから先を変更する
// ガードを増やした場合はここのケースに追加していく
switch($exception->guard()[0]) {
case 'admin':
return redirect()->guest(route('admin.login'));
break;
default:
return redirect()->guest(route('member.login'));
break;
}
}
}
Reference
이 문제에 관하여(Laravel5.4에서 여러 계정 기능에 대해 각각 인증), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ll_kuma_ll/items/1415f57c76c534fa2a5f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)