2016-05-25 17 views
10

Sto cercando di ottenere un sistema multi-auth che funzioni dove gli utenti possono accedere tramite il normale portale Web, ma un database separato di entità (denominato "robot" ad esempio) può anche accedere tramite un driver token di protezione API. Ma non importa quello che faccio, il setup che ho non sta indirizzando la mia guardia di autenticazione al database di Robot corretto e continua a provare ad autenticare queste richieste come utenti tramite token (che fallisce, perché gli utenti non hanno token).Laravel 5.2 Multi-Auth con API guard utilizza la tabella errata

Qualcuno può aiutarmi a trovare dove ho sbagliato?

Ho iniziato mettendo insieme un gruppo di middleware in Kernel.php:

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

Questo utilizza le impostazioni in 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, 
    ], 
], 

Il middleware viene chiamato in routes.php

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

utilizza questo modello:

<?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', 
    ]; 
} 

Qualche idea?

Aggiornamento: su un'ulteriore ispezione, sembra che la maggior parte delle impostazioni in auth.php non si stiano applicando correttamente - c'è un modo in cui posso forzare queste impostazioni ad avere effetto?

+0

Utilizzo del servizio Web? –

+0

Cosa intendi? Non sto utilizzando il middleware web, poiché genererà un'eccezione token per le chiamate API. – Luciasar

+0

se si utilizza l'API quindi passare api_token sull'intestazione –

risposta

4

effettivo problema/soluzione:

laravel ha un separato cache, raramente menzionati che esiste esclusivamente per i suoi file di configurazione. I normali metodi di ripristino della cache e classe come composer dump-autoload e php artisan cache:clear non influiscono su questa cache, il che stava portando al mio stato confuso di non avere nessuna delle impostazioni nel mio file auth.php.

Il modo corretto per cancellare la cache è di usare i comandi:

php artisan config:cache

php artisan config:clear

Questi risolto il mio problema.

3

Nel file config/auth.php si specifica il modello fornito da utilizzare per il provider di robot: 'model' => App\Models\Robot::class Tuttavia la classe del robot è definita come class Robots extends Authenticatable, che è una mancata corrispondenza del nome classe.

Rinominare la classe per class Robot

+0

Per la classe è necessario l'autenticabile per utilizzare il driver Token, penso. Inoltre, perché la sintassi dell'estensione potrebbe cambiare il nome della classe? – Luciasar

+0

Il nome della tua classe è Robots (plurale). Rinominarlo in Robot (singolare) – henrik

+0

Vedo. Questa è una buona presa, ma in realtà non era il problema che stavo avendo (vedi sotto). Ti darò la ricompensa generosa per questo, grazie per averlo letto! – Luciasar