2015-07-17 17 views
7

Sono nuovo di Laravel ma mi sono innamorato della struttura e ho deciso di usarlo per il mio progetto.Come disabilitare l'accesso automatico al registro in Laravel 5?

Ho un campo active e per impostazione predefinita l'ho impostato su 0. Nel metodo Attempt(), ho impostato $credentials['active'] = 1. Quando eseguo il logout e riconnesso, funziona correttamente.

Ma quando registro un utente, esso registra automaticamente l'utente senza controllare il campo attivo.

risposta

4

Presumo che si stia utilizzando il tratto AuthenticatesAndRegistersUsers nel controller.

La registrazione viene effettuata con il metodo postRegister() in quella caratteristica, che chiama il metodo login() dopo aver creato un nuovo utente.

È possibile ignorare questo metodo nel controller e solo chiamare il metodo login() quando il campo è activetrue. Così, il metodo postRegister() sarà qualcosa di simile:

public function postRegister(Request $request) 
{ 
    $validator = $this->registrar->validator($request->all()); 

    if ($validator->fails()) 
    { 
     $this->throwValidationException(
      $request, $validator 
     ); 
    } 

    $user = $this->registrar->create($request->all()); 

    if ($request->get('active')) { 
     $this->auth->login($user); 
    } 

    return redirect($this->redirectPath()); 
} 
1

In registersUsers.php sostituire la linea:

Auth::guard($this->getGuard())->login($this->create($request->all())); 

Con la seguente:

$this->create($request->all()); 

Questo ha funzionato per me, Uso Laravel 5.2

+1

Non è una buona idea sovrascrivere i file principali. Puoi sovrascrivere il metodo in 'Auth \ RegisterController', quindi se c'è un aggiornamento, non cancella ciò che hai personalizzato. –

0

Eviterei di aggiungere il campo active alle credenziali: si tratta di un problema di autorizzazione piuttosto che di autenticazione.

Per questo, vorrei utilizzare un middleware per verificare se un utente connesso è attivo o inattivo. In 5.3, il middleware sarebbe simile a questa:

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Support\Facades\Auth; 

class RedirectIfInactive 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if ($user = Auth::guard('web')->user()) { 
      if (! $user->active) 
       return redirect(route('account_inactive')); 
     } 

     return $next($request); 
    } 
} 

Questo middleware deve quindi essere registrata all'interno Kernel.php:

protected $routeMiddleware = [ 
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::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, 
    'inactive' => \App\Http\Middleware\RedirectIfInactive::class, 
]; 

E poi finalmente proteggiamo tutti i nostri itinerari con esso:

Route::get('inactive', ['as' => 'account_inactive', function() { 
    return view('inactive'); 
}]); 

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'inactive'], function() { 
    Route::get('/', ['as' => 'admin.home', 'uses' => '[email protected]']); 
}); 

Il vantaggio di questo approccio, naturalmente, è che possiamo visualizzare un messaggio di errore più pertinente rispetto al generale "Queste credenziali non corrispondono al nostro recor ds 'che le persone con dettagli di autenticazione cattivi ottengono. Quindi l'utente saprebbe che non è colpa loro non è possibile accedere.

In ogni caso, con l'approccio nella risposta accettata, assicurarsi di aver fatto lo stesso per quando l'utente reimposta correttamente la propria password in quanto sono anche auto- loggato allora.