Bất cứ ai cũng có thể giải thích Laravel 5.2 Multi Auth với ví dụ


171

Tôi đang cố gắng xác thực người dùng và bảng mẫu quản trịuseradminbảng tương ứng. Tôi đang sử dụng Usermô hình được cung cấp bởi laravel ra khỏi hộp và tạo ra tương tự vì Admin.tôi đã thêm khóa bảo vệ và khóa nhà cung cấp vàoauth.php.

Bảo vệ

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

Nhà cung cấp

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

Tuyến đường

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');
});

Tôi đã tạo một thư mục có tên là AuthAdminmặc định AuthController.phpPasswordController.phpcác tập tin của Laravel . (Không gian tên được sửa đổi cho phù hợp)

Trước hết, trong các tài liệu của Laravel đã đề cập rằng làm thế nào để chỉ định bảo vệ tùy chỉnh trong khi xác thực như thế này không hoạt động.
nhập mô tả hình ảnh ở đây

Có một phương pháp khác được đề cập trong các tài liệu của Laravel để sử dụng một người bảo vệ cũng không hoạt động.

nhập mô tả hình ảnh ở đây

Sẽ có ích nếu ai đó có thể giải quyết các vấn đề và sửa chữa cho tôi nếu tôi sai.


Laravel đã sửa một lỗi trong phiên bản 5.2.6. protected $guard = 'guard_name'có thể được sử dụng ngay bây giờ.
imrealashu

Trong Laravel có nhiều gói trình tạo bảng điều khiển dành cho quản trị viên có sẵn. Tôi thích quản trị Voyager. Cài đặt chúng dễ dàng và dễ dàng. Nó có thể giúp bạn tiết kiệm hàng tấn mã. Bạn chỉ cần hiểu làm thế nào nó hoạt động. Đừng phát minh lại bánh xe. Voyager - The Missing Laravel Admin Một ứng dụng Laravel với Gentelella bootstrap admin tempalte.
sathish R

Câu trả lời:


201

Sau rất nhiều lần đào và rất nhiều câu hỏi & câu trả lời, cuối cùng tôi cũng đã làm việc được với Laravel 5.2 Multi Auth với hai bảng, vì vậy tôi đang viết Trả lời câu hỏi của riêng tôi.

Cách triển khai Multi Auth trong Larvel 5.2

Như đã đề cập ở trên. Hai bàn adminusers

Laravel 5.2 có một artisanlệnh mới .

php artisan make:auth

nó sẽ tạo cơ bản đăng nhập / đăng ký route, viewcontrollercho userbảng.

Tạo một adminbảng như usersbảng cho đơn giản.

Trình điều khiển dành cho quản trị viên
app/Http/Controllers/AdminAuth/AuthController
app/Http/Controllers/AdminAuth/PasswordController
(lưu ý: Tôi vừa sao chép các tệp này từ app/Http/Controllers/Auth/AuthControllerđây)

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

Thêm hai phương thức và chỉ định $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');
}  

nó sẽ giúp bạn mở một hình thức đăng nhập khác cho quản trị viên

tạo một phần mềm trung gian cho 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);
}

}

đăng ký phần mềm trung gian trong kernel.php

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

sử dụng phần mềm trung gian này AdminController , vd

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');
    }
}

Đó là tất cả cần thiết để làm cho nó hoạt động và cũng để có được json sử dụng quản trị viên xác thực
Auth::guard('admin')->user()

Chỉnh sửa - 1
Chúng tôi có thể truy cập trực tiếp người dùng được xác thực bằng cách sử dụng
Auth::user() nhưng nếu bạn có hai bảng xác thực thì bạn phải sử dụng

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

để đăng xuất

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

cho người dùng xác thực json

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

Chỉnh sửa 2

Bây giờ bạn có thể tải xuống Dự án được thực hiện bởi Multiauth Multimuth http://imrealashu.in/code/laravel/multi-auth-with-laravel-5-2-2/


cảm ơn rất nhiều người, đây là những gì tôi đang tìm kiếm, nó đã làm việc với một chút sửa đổi. cảm ơn rất nhiều +1 cho Q và +1 cho Ans, ước gì tôi có thể +1 hơn nữa. cảm ơn rất nhiều ..
rummykhan 2/2/2016

@imrealashu, Như tôi đã tạo dự án theo câu trả lời của bạn. Nhưng nó tạo ra lỗi của nhiều lớp có cùng tên. Vậy thì sao? Nếu tôi thay đổi tên lớp cho quản trị viên auth, vậy tôi cần thay đổi ở đâu?
Akshay Vaghasiya

1
bạn cũng có thể giải thích cách "Đặt lại mật khẩu" cho người bảo vệ quản trị viên.
Shoaib Rehan

1
Cảm ơn lời giải thích tuyệt vời rất hữu ích cho tôi mọi thứ. Để sử dụng khách trung gian, hãy thay đổi tệp Redirect IfAuthenticated.php theo dòng sau: Bản gốc: if (Auth :: guard ($ guard) -> check ()) { return redirect ('/'); } Sau khi thay đổi: if (Auth :: guard ('yourcustomguard') -> check () || Auth :: check ()) { return redirect ('/'); }
Cristian Meza

1
@Jeffz chỉ vì tài liệu không tốt và không có ví dụ hoạt động trên đa auth .. chúng tôi mong đợi tài liệu tốt và vâng các tính năng mới tuyệt vời trên bản cập nhật 5.3 này.
imrealashu

2

Trong trường hợp điều này giúp được bất cứ ai, và điều này có thể là do tôi không hiểu về phần mềm trung gian, đây là những gì tôi phải làm để làm việc này (ngoài các bước được thực hiện bởi @imrealashu) ...

Trong route.php:

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

Đây là trong webnhóm phần mềm trung gian. Trước đó, tôi đã thử đặt nó vào một adminnhóm phần mềm trung gian riêng biệt và thậm chí trong một auth:adminnhóm nhưng điều này không hoạt động, nó chỉ hoạt động với tôi khi tôi chỉ định phần mềm trung gian là quản trị viên trên chính tuyến đường. Tôi không biết tại sao lại như vậy nhưng tôi hy vọng nó sẽ cứu người khác khỏi việc nhổ tóc như tôi đã làm.


Tôi đã tải xuống tệp zip nhiều auth của bạn được thay thế bằng các tệp dự án hiện có sau đó khi tôi di chuyển DB của mình, lỗi này hiển thị .. [Symfony \ Component \ Console \ Exception \ RuntimeException] Không đủ đối số (thiếu: "name").
G Naga Subrahmanyam

Trên thực tế đối với tôi admin đang đăng nhập nhưng không được chuyển hướng đến admin. Sau khi làm điều này nó hoạt động bạn có thể xin vui lòng cho biết tại sao như vậy? Tôi đã phải đăng ký các tuyến khác nếu có thể Route::group(['middleware' => ['admin']], function () { //Admin Routes... });vì nó không hoạt động với tôi
Leap Hawk

0

Nó rất dễ dàng trong laravel 5.6. Chỉ cần đi đến config/auth.phpvà thêm dòng này trong providersmảng:

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

Lưu ý rằng chúng tôi sử dụng databasecho trình điều khiển không eloquent.

Bây giờ thêm điều này vào guardsmảng:

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

Bây giờ chúng ta đã hoàn thành! Sử dụng cái này khi làm việc với bảng quản trị viên:

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

Chúc mừng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.