2016-05-25 14 views
10

Tôi đang cố gắng để có được một hệ thống multi-auth làm việc, nơi người dùng có thể đăng nhập thông qua cổng web thông thường, nhưng một cơ sở dữ liệu riêng biệt của thực thể (tên là "robot" ví dụ) cũng có thể đăng nhập thông qua trình điều khiển mã thông báo API bảo vệ. Nhưng dù tôi có làm gì đi chăng nữa, thiết lập mà tôi có không hướng dẫn bảo vệ xác thực của tôi đến cơ sở dữ liệu Robot chính xác và cố gắng xác thực các yêu cầu này như Người dùng thông qua mã thông báo (không thành công, vì người dùng không có mã thông báo).Laravel 5.2 Multi-Auth với API guard sử dụng sai bảng

Ai đó có thể giúp tôi tìm thấy nơi tôi đã đi sai?

Tôi đã bắt đầu bằng cách ghép một nhóm trung gian trong Kernel.php:

'api' => [ 
    'throttle:60,1', 
     'auth:api', 
], 

này sử dụng cài đặt trong config/auth.php

'guards' => [ 
     'web' => [ 
      'driver' => 'session', 
      'provider' => 'users', 
     ], 

     'api' => [ 
      'driver' => 'token', 
      'provider' => 'robots', 
     ], 
    ], 

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

    'robots' => [ 
     'driver' => 'eloquent', 
     'model' => App\Models\Robot::class, 
    ], 
], 

Các middleware được gọi trong routes.php

Route::group(['middleware' => 'api'], function() { 
    Route::get('api/request', 'API\[email protected]'); 
}); 

Nó sử dụng mô hình này:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Contracts\Auth\Authenticatable; 

class Robots extends Authenticatable 
{ 
    protected $fillable = [ 
     'serial_number','api_token', 
    ]; 
    protected $guard = 'Robots'; 

    protected $hidden = [ 
     'api_token', 
    ]; 
} 

Bất kỳ ý tưởng nào?

Cập nhật: để kiểm tra thêm, có vẻ như hầu hết các cài đặt trong auth.php không được áp dụng đúng cách - có cách nào để buộc các cài đặt này có hiệu lực không?

+0

Sử dụng dịch vụ web? –

+0

Ý của bạn là gì? Tôi không sử dụng phần mềm trung gian web, vì điều đó sẽ ném một ngoại lệ mã thông báo cho các cuộc gọi API. – Luciasar

+0

nếu sử dụng API, sau đó vượt qua api_token trên tiêu đề –

Trả lời

4

thực tế vấn đề/giải pháp:

Laravel có một riêng biệt, bộ nhớ cache hiếm khi đề cập đến việc tồn tại độc quyền cho các tập tin cấu hình của nó. Các phương thức đặt lại lớp và bộ nhớ cache bình thường như composer dump-autoloadphp artisan cache:clear không ảnh hưởng đến bộ nhớ cache này, điều này dẫn đến trạng thái khó hiểu của tôi khi không có cài đặt nào trong tệp auth.php của tôi có hiệu lực.

Cách đúng để xóa bộ nhớ cache này là sử dụng các lệnh:

php artisan config:cache

php artisan config:clear

Những giải quyết vấn đề của tôi.

3

Trong cấu hình/auth.php bạn chỉ định mô hình được cung cấp sẽ được sử dụng cho nhà cung cấp rô bốt: 'model' => App\Models\Robot::class Tuy nhiên lớp Robot của bạn được định nghĩa là class Robots extends Authenticatable, không khớp với tên lớp.

Đổi tên lớp học của bạn để class Robot

+0

Authenticatable là cần thiết cho các lớp học để sử dụng trình điều khiển Token, tôi nghĩ. Ngoài ra, tại sao cú pháp mở rộng sẽ thay đổi tên của lớp? – Luciasar

+0

Tên lớp học của bạn là Robots (số nhiều). Đổi tên nó thành Robot (số ít) – henrik

+0

Tôi hiểu. Đây là một đánh bắt tốt nhưng không thực sự là vấn đề tôi gặp phải (xem bên dưới). Tôi sẽ cung cấp cho bạn phần thưởng bounty cho nó mặc dù, cảm ơn bạn đã tìm kiếm nó! – Luciasar

Các vấn đề liên quan