В Laravel 5.2, как мне добиться правильного перенаправления на домашнюю страницу после аутентификации?


я приветствую всех и попытался немного настроить аутентификацию, которую Laravel предоставляет после использования команды:

php artisan make:auth

Я изменил файл auth.php:

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

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


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

это должно быть хорошо. Я также изменил модель:

protected $table = "ctrl_usuarios";
protected $primaryKey = 'id_usuario';
protected $fillable = [
    'id_usuario', 'email', 'password',
];
public static $rules = array(
    'email' => 'required',
    'password' => 'required'
);

public $timestamps = false;

точно так же я настроил trait AuthenticareUsers и поместил его в namespace, который вы видите сразу:

namespace App\Http\Controllers\Auth;

use Illuminate\Contracts\Auth\Guard as Auth;
use Illuminate\Http\RedirectResponse;
use App\Http\Requests\AuthRequest as Request;

trait AuthenticatesUsers
{
    public function __construct(){
        $this->middleware("guest", ['except' => 'logout']);
    }

    public function login(Request $request, Auth $auth){
        $authotized = $auth->attempt($request->only('email', 'password'));
        if ($authotized){
            return redirect('/inicio');
        }

        return back()->
            with('authError', 'Email o contraseña incorrectos')->
            withInput($request->except('password'));
    }

    public function logout (Auth $auth){
        $auth->logout();
        return redirect('/');
    }
}

конечно, в AuthController я ссылаюсь на новый AuthenticateUsers. содержание я также изменил следующим образом:

use AuthenticatesUsers;

public function __construct()
{
    $this->middleware('guest', ['except' => 'logout']);
}

public function index() {
    return view('auth.login');
}

о файле routes.php, а так:

Route::group(['middleware' => ['web']], function () {
    Route::get('/', ['middleware'=> 'auth', 'uses' =>'HomeController@index']);
    Route::get('inicio', ['middleware'=> ['auth'], 'uses' =>'HomeController@index']);

    Route::get('acceso', 'Auth\AuthController@index');
    Route::post('acceso', 'Auth\AuthController@login');
    Route::get('cerrarsesion', 'Auth\AuthController@logout');

    // Registration Routes...
    Route::get('register', 'Auth\AuthController@showRegistrationForm');
    Route::post('register', 'Auth\AuthController@register');

});

из промежуточного программного обеспечения я изменил только целевые маршруты.

вышеизложенное было изменено как есть. я пытаюсь получить значение Auth внутри AuthenticateUsers (После отправки формы входа) у меня есть следующий результат:

SessionGuard {#166 ▼
#name: "web"
#lastAttempted: User {#198 ▶}
#viaRemember: false
#session: Store {#134 ▶}
#cookie: CookieJar {#133 ▶}
#request: Request {#40 ▶}
#events: Dispatcher {#5 ▶}
#loggedOut: false
#tokenRetrievalAttempted: false
#user: User {#198 ▼
#table: "ctrl_usuarios"
#primaryKey: "id_usuario"
#fillable: array:3 [▶]
+timestamps: false
#connection: null
#perPage: 15
+incrementing: true
#attributes: array:8 [▶]
#original: array:8 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
+wasRecentlyCreated: false
}
#provider: EloquentUserProvider {#162 ▶}
}

который намекает на то, что пользователь правильно вошел в систему, но, похоже, сеанс не был сохранен, что при адресе:

return redirect('/inicio');

это не так. Обработчиком этого пути является HomeController, и он использует метод index(). Содержимое этого метода Index:

return view('/inicio');

и, наконец, конструктор HomeController имеет следующее содержимое:

$this->middleware('auth');

я попытался сделать работу как можно более полной, но я не вижу правильных результатов перенаправления, я не знаю, что я буду делать неправильно, я был бы признателен за любую помощь, которая может направить меня к решению этого проблема.

Author: César, 2016-01-16

8 answers

Как описано в документации laravel 5.2 вы должны установить свойство redirectTo в своем AuthController:

protected $redirectTo = '/home';

При правильном входе перенаправляет на "home", в противном случае перенаправляет на форму входа снова.

Я не понимаю, для этого return redirect('/inicio'); внутри AuthenticatesUsers, если у вас уже есть protected $redirectTo = '/home'; в AuthController, вероятно, проблема trait AuthenticatesUsers, я бы использовал laravel.

use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

Вы также должны проверить Kernel.php и убедитесь, что группы промежуточного программного обеспечения верны, это должно быть что-то вроде этого:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],

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

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
 2
Author: Ivan Domenech, 2016-02-01 09:28:35

Я делаю это очень простым способом создать новый AuthController и не использовать тот, который создает по умолчанию laravel.

public function store(Request $request)
{
    $this->validate($request, [
        'email'    => 'required|email',
        'password' => 'required',
    ]);
    if (!auth()->attempt($request->only(['email', 'password']))) {
        return redirect()->route('auth_show_path')->withErrors('No encontramos al usuario.');
    }
    return redirect()->intended('/');
}
 2
Author: aranajhonny, 2016-02-01 16:20:10

Я оставляю свой скрипт, где у меня есть свои собственные методы аутентификации

Контроллер самоподдержки:

public function getLogin()
  {
    $data['title'] = "Login";
    return view('plataforma.login',$data);
  }

public function postLogear(Request $request)
  {
    //Mensaje de error
    $messages = [
      'required' => ':Attribute es requerido',
    ];
    //Reglas de validación
    $rules = [
      'email' => 'required',
      'password' => 'required',
    ];
    //Valido los campos
    $validator = Validator::make($request->all(), $rules,$messages);
    if ($validator->fails()) {
      return redirect('plataforma/login')
      ->withErrors($validator)
      ->withInput();
    }
    //Condiciones para la consulta sql
    $where = ['email' => $request->email, 'password' => $request->password];
    $administrador = administrador::where($where)->find(1);
    //Si el usuario no existe en la base de datos, redireccionará a la vista login
    if($administrador == null)
    {
      return redirect('plataforma/login')
      ->withErrors(array("messages"=>"Datos incorrectos"))
      ->withInput();
    }else{
      //Si el usuario existe, creo las variables de sesión que se utilizarán para validar el ingreso
      $request->session()->put('sesionAdministrador', true);
      $request->session()->put('nombreUsuario', $administrador->nombre);
      $request->session()->put('apellidoUsuario', $administrador->apellido);
      $request->session()->put('idUsuario', $administrador->id);
      return redirect('plataforma/principal');
    }
  }

Представление формы в blade будет:

<form action="logear" class="form-horizontal" method="post">
          <input type="hidden" name="_token" value="{{ csrf_token() }}">
          <div class="form-group">
            <div class="col-md-12">
              <input type="text" class="form-control" name="email" placeholder="Email"/>
            </div>
          </div>
          <div class="form-group">
            <div class="col-md-12">
              <input type="password" class="form-control" name="password" placeholder="Password"/>
            </div>
          </div>
          <div class="form-group">
            <div class="col-md-6">
              <button class="btn btn-info btn-block">Ingresar</button>
            </div>
          </div>
</form>

И промежуточное программное обеспечение будет выглядеть следующим образом:

public function handle($request, Closure $next)
  {
    if ($request->session()->get('sesionAdministrador') == null) {
      return redirect('plataforma/login');
    }

    return $next($request);
  }

Привет!

 1
Author: Luis Alberto Aguilera Clarke, 2016-02-01 14:13:17

Вы проверили, что в путях, которые вы определяете, нет конфликта, основываясь на том, что вы поделились кодом эти два пути используют в одном методе (index ()) контроллера:

Route::get('/', ['middleware'=> 'auth', 'uses' =>'HomeController@index']);
Route::get('inicio', ['middleware'=> ['auth'], 'uses' =>'HomeController@index']);
 1
Author: Agus Rdz, 2016-04-02 07:15:00

Вы правы Иван G Domenech в контроллере находится в app\Http\Controllers\Auth\AuthController.

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{


    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    protected $redirectTo = '/';  /*Aqui tienes que modificar 
                                   la ruta a donde quieres redirigir una vez autenticado*/
 1
Author: happones, 2017-04-13 13:00:52

Это должно вернуться к direcion до аутентификации, которая была сделана.

class FacebookController extends Controller{

public function redirectToProvider(){
    Session::flash('url', URL::previous());
    return \Socialite::driver('facebook')->redirect();
}

public function handleProviderCallback(){
    $user = \Socialite::driver('facebook')->user();
    return Redirect::to(Session::get('url'));  
}
}

Если вы хотите на домашнюю страницу, просто измените строку:

return Redirect::to('/inicio');  
 1
Author: Elkin Fajardo, 2016-08-24 00:57:52

App/Http/Middleware/RedirectIfAuthenticated.php

/ / в этой части вы устанавливаете, куда вы хотите, чтобы он привел вас после аутентификации

public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/miruta');
        }

        return $next($request);
    }
 1
Author: Aldair Aquino, 2016-10-09 09:06:45

Для перенаправления в laravel 5.4

href="{{ url('/') }}"
 1
Author: Legendario, 2017-05-14 15:18:11