ใครสามารถอธิบาย Laravel 5.2 Multi Auth ด้วยตัวอย่างได้


172

ฉันพยายามที่จะพิสูจน์ตัวตนผู้ใช้และผู้ดูแลระบบรูปแบบuserตารางและadminตารางตามลำดับ ฉันใช้Userโมเดลตามที่ laravel จัดหาให้และสร้างแบบเดียวกันสำหรับAdmin.ฉันได้เพิ่มรหัสป้องกันและรหัสผู้ให้บริการลงในauth.php.

ยาม

'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

ผู้ให้บริการ

'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

เส้นทาง

Route::group(['middleware' => ['web']], function () {
    // Login Routes.   
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes.
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');
});

ฉันสร้างไดเรคทอรีAuthAdminซึ่งเรียกว่าเป็นไฟล์เริ่มต้นAuthController.phpและPasswordController.phpไฟล์ (Namespace ปรับเปลี่ยนตาม)

ก่อนอื่นในเอกสารของ Laravel กล่าวถึงวิธีการระบุ Guard แบบกำหนดเองในขณะที่ตรวจสอบความถูกต้องเช่นนี้ซึ่งไม่ทำงาน
ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีอื่นที่กล่าวถึงในเอกสารของ Laravel เพื่อใช้ตัวป้องกันที่ไม่ทำงานเช่นกัน

ป้อนคำอธิบายรูปภาพที่นี่

มันจะเป็นประโยชน์ถ้าใครบางคนสามารถแก้ไขปัญหาและแก้ไขให้ฉันถ้าฉันผิด


Laravel แก้ไขข้อผิดพลาดในรุ่น 5.2.6 protected $guard = 'guard_name'สามารถใช้ได้ตอนนี้
imrealashu

ใน Laravel มีแพ็คเกจตัวสร้างแผงผู้ดูแลระบบจำนวนมาก ฉันชอบ Voyager Admin ติดตั้งง่ายและรวดเร็ว มันอาจช่วยให้คุณประหยัดรหัสตัน คุณเพียงแค่ต้องเข้าใจว่ามันทำงานอย่างไร อย่าประดิษฐ์ล้อใหม่ Voyager - ผู้ดูแล Laravel ที่ขาดหายไป แอปพลิเคชั่น Laravel พร้อม Gentelella bootstrap admin tempalte
sathish R

คำตอบ:


201

หลังจากขุดจำนวนมากและมีคำถาม & คำตอบในที่สุดฉันก็สามารถทำงาน Laravel 5.2 Multi Auth พร้อมโต๊ะสองตัวได้ดังนั้นฉันจึงเขียนคำตอบสำหรับคำถามของฉันเอง

วิธีการนำ Multi Auth ไปใช้ใน Larvel 5.2

ดังกล่าวข้างต้น สองโต๊ะadminและusers

Laravel 5.2 มีartisanคำสั่ง ใหม่

php artisan make:auth

มันจะสร้างพื้นฐานเข้าสู่ระบบ / ลงทะเบียนroute, viewและcontrollerสำหรับuserตาราง

ทำadminตารางเป็นusersตารางเพื่อความเรียบง่าย

คอนโทรลเลอร์สำหรับผู้ดูแลระบบ
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(หมายเหตุ: ฉันเพิ่งคัดลอกไฟล์เหล่านี้จากapp/Http/Controllers/Auth/AuthControllerที่นี่)

config/auth.php

//Authenticating guards
'guards' => [
    'user' =>[
        'driver' => 'session',
        'provider' => 'user',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
],  

//User Providers
'providers' => [
    'user' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admin' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],  

//Resetting Password  
'passwords' => [
    'clients' => [
        'provider' => 'client',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admin',
        'email' => 'auth.emails.password',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],  

route.php

Route::group(['middleware' => ['web']], function () {
    //Login Routes...
    Route::get('/admin/login','AdminAuth\AuthController@showLoginForm');
    Route::post('/admin/login','AdminAuth\AuthController@login');
    Route::get('/admin/logout','AdminAuth\AuthController@logout');

    // Registration Routes...
    Route::get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
    Route::post('admin/register', 'AdminAuth\AuthController@register');

    Route::get('/admin', 'AdminController@index');

});  

AdminAuth/AuthController.php

เพิ่มสองวิธีและระบุ$redirectToและ$guard

protected $redirectTo = '/admin';
protected $guard = 'admin';
public function showLoginForm()
{
    if (view()->exists('auth.authenticate')) {
        return view('auth.authenticate');
    }

    return view('admin.auth.login');
}
public function showRegistrationForm()
{
    return view('admin.auth.register');
}  

มันจะช่วยให้คุณเปิดแบบฟอร์มการเข้าสู่ระบบอื่นสำหรับผู้ดูแลระบบ

สร้างมิดเดิลแวร์สำหรับ admin

class RedirectIfNotAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @return mixed
 */
public function handle($request, Closure $next, $guard = 'admin')
{
    if (!Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}

}

ลงทะเบียนมิดเดิลแวร์ใน kernel.php

 protected $routeMiddleware = [
    'admin' => \App\Http\Middleware\RedirectIfNotAdmin::class,
];

ใช้มิดเดิลแวร์นี้ในAdminController เช่น

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('admin');
   }
public function index(){
        return view('admin.dashboard');
    }
}

นั่นคือทั้งหมดที่จำเป็นในการทำให้มันใช้งานได้และเพื่อให้ได้ json ของผู้ดูแลระบบที่ใช้สิทธิ์
Auth::guard('admin')->user()

แก้ไข - 1
เราสามารถเข้าถึงผู้ใช้ที่ได้รับการรับรองความถูกต้องโดยตรงโดยใช้
Auth::user() แต่ถ้าคุณมีตารางการรับรองความถูกต้องสองตารางคุณต้องใช้

Auth::guard('guard_name')->user()  

สำหรับการออกจากระบบ

Auth::guard('guard_name')->user()->logout()

สำหรับผู้ใช้ที่ได้รับการรับรองความถูกต้อง json

Auth::guard('guard_name')->user()  

แก้ไข 2

ตอนนี้คุณสามารถดาวน์โหลด Laravel 5.2 Multiauth ที่ใช้งานโครงการhttp://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


ขอบคุณชายมากนี่คือสิ่งที่ฉันกำลังค้นหามันทำงานร่วมกับการดัดแปลงเล็กน้อย ขอบคุณ +1 มากสำหรับ Q และ +1 สำหรับ Ans หวังว่าฉันจะ +1 ได้อีก ขอบคุณมาก ..
rummykhan

@imrealashu ตามที่ฉันได้สร้างโครงการตามคำตอบของคุณ แต่มันสร้างข้อผิดพลาดของหลายคลาสที่มีชื่อเดียวกัน แล้วมันเกี่ยวกับอะไร หากฉันเปลี่ยนชื่อคลาสสำหรับ admin auth ฉันต้องเปลี่ยนอะไรที่ไหน?
Akshay Vaghasiya

1
คุณช่วยอธิบายวิธีการ "รีเซ็ตรหัสผ่าน" ให้กับผู้ดูแลระบบได้ไหม
Shoaib Rehan

1
ขอบคุณสำหรับคำอธิบายที่ดีเยี่ยมมีประโยชน์มากสำหรับฉันทุกอย่าง ในการใช้มิดเดิ้ลเกสต์ให้เปลี่ยนไฟล์ RedirectIfAuthenticated.php บรรทัดต่อไปนี้: ดั้งเดิม: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } หลังการเปลี่ยนแปลง: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza

1
@Jeffz เป็นเพียงเพราะเอกสารไม่ดีและไม่มีตัวอย่างการทำงานในการรับรองความถูกต้อง .. เราคาดหวังว่าเอกสารที่ดีและใช่คุณสมบัติใหม่ที่ยอดเยี่ยมในการอัพเดท 5.3 นี้
imrealashu

2

ในกรณีนี้จะช่วยให้ทุกคนและนี่อาจเป็นเพราะการขาดความเข้าใจในมิดเดิลแวร์ของฉันนี่คือสิ่งที่ฉันต้องทำเพื่อให้การทำงานนี้ (นอกเหนือจากขั้นตอนที่ @imrealashu) ...

ในroute.php:

Route::get('/admin', [
  'middleware' => 'admin',
  'uses' => 'AdminController@index'
]);

นี่คือwebกลุ่มมิดเดิลแวร์ ก่อนหน้านี้ฉันลองวางไว้ในadminกลุ่มมิดเดิลแวร์ที่แยกจากกันและแม้กระทั่งในauth:adminกลุ่ม แต่ไม่ได้ผลมันก็ใช้ได้กับฉันเมื่อฉันระบุมิดเดิลแวร์เป็นผู้ดูแลระบบในเส้นทางเท่านั้น ฉันไม่รู้ว่าทำไมถึงเป็นเช่นนี้ แต่ฉันหวังว่ามันจะช่วยให้ผู้อื่นไม่สามารถดึงผมออกมาเหมือนที่ฉันทำ


ฉันดาวน์โหลดไฟล์ zip รับรองความถูกต้องหลายอันของคุณแทนที่ด้วยไฟล์โครงการ ezisting จากนั้นเมื่อฉันย้ายฐานข้อมูลของฉันแสดงข้อผิดพลาดนี้ .. [Symfony \ Component \ Console \ Exception \ RuntimeException] อาร์กิวเมนต์ไม่เพียงพอ (ขาดหายไป: "ชื่อ")
G Naga Subrahmanyam

ที่จริงแล้วสำหรับฉันผู้ดูแลระบบกำลังเข้าสู่ระบบ แต่ไม่ได้เปลี่ยนเส้นทางไปยังผู้ดูแลระบบ หลังจากทำสิ่งนี้แล้วคุณจะสามารถบอกได้ว่าเหตุใด ฉันต้องลงทะเบียนเส้นทางอื่น ๆ เพราะมันเป็นไปได้ด้วยRoute::group(['middleware' => ['admin']], function () { //Admin Routes... });สาเหตุมันไม่ทำงานสำหรับฉัน
Leap Hawk

0

มันง่ายมากใน laravel 5.6 เพียงไปที่config/auth.phpและเพิ่มบรรทัดนี้ในprovidersอาร์เรย์:

'admins' => [
   'driver' => 'database',
   'table' => 'admin_table'
]

หมายเหตุที่เราใช้ในการขับไม่ได้databaseeloquent

ตอนนี้เพิ่มไปยังguardsอาร์เรย์:

'admin_guard' => [
   'driver' => 'session',
   'provider' => 'admins'
]

ตอนนี้เราเสร็จแล้ว! ใช้สิ่งนี้เมื่อทำงานกับตารางผู้ดูแลระบบ:

Auth::guard('admin_guard')->User();

ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.