2015-07-17 12 views
7

Jestem nowością w Laravel, ale zakochałem się w tej strukturze i postanowiłem wykorzystać ją do mojego projektu.Jak wyłączyć automatyczne logowanie do rejestru w Laravel 5?

Mam pole active i domyślnie ustawiłem je na 0. W metodzie Attempt() ustawiłem $credentials['active'] = 1. Kiedy się wyloguję i zaloguję ponownie, działa to dobrze.

Ale kiedy rejestruję użytkownika, automatycznie loguje użytkownika bez sprawdzania aktywnego pola.

Odpowiedz

4

Zakładam, że używasz cechy AuthenticatesAndRegistersUsers w kontrolerze.

Rejestracja jest przeprowadzana metodą postRegister() w tej funkcji, która wywołuje metodę login() po utworzeniu nowego użytkownika.

Można zastąpić tę metodę w kontrolerze i wywołać metodę login() tylko wtedy, gdy pole active jest . Tak więc, metoda postRegister() będzie coś takiego:

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

W registersUsers.php zastąpić linię:

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

z następującymi:

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

ten pracował dla mnie, Używam Laravel 5.2

+1

Nie jest dobrym pomysłem na zastąpienie podstawowych plików. Możesz zastąpić metodę w 'Auth \ RegisterController', więc jeśli kiedykolwiek pojawi się aktualizacja, to nie usunie tego, co dostosowałeś. –

0

Unikałbym dodawania do poświadczeń pola active - jest to problem autoryzacji, a nie uwierzytelniania.

Do tego użyłbym oprogramowania pośredniego, aby sprawdzić, czy zalogowany użytkownik jest aktywny lub nieaktywny. 5.3, middleware będzie wyglądać następująco:

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

Niniejsza middleware musi następnie zostać zarejestrowany wewnątrz 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, 
]; 

i wreszcie możemy chronić wszystkie nasze trasy z nim:

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

Zaletą tego podejścia jest oczywiście to, że możemy wyświetlić bardziej trafny komunikat o błędzie niż ogólne "Te poświadczenia nie pasują do naszego rekordu ds, że ludzie mają złe dane auth. Użytkownik wie, że to nie ich wina, że ​​nie mogą się zalogować.

W każdym razie, stosując podejście przyjęte w przyjętej odpowiedzi, upewnij się, że zrobiłeś to samo, gdy użytkownik pomyślnie resetuje swoje hasło, ponieważ są one również automatycznie zalogowany wtedy.

Powiązane problemy