В 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');
я попытался сделать работу как можно более полной, но я не вижу правильных результатов перенаправления, я не знаю, что я буду делать неправильно, я был бы признателен за любую помощь, которая может направить меня к решению этого проблема.
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,
];
Я делаю это очень простым способом создать новый 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('/');
}
Я оставляю свой скрипт, где у меня есть свои собственные методы аутентификации
Контроллер самоподдержки:
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);
}
Привет!
Вы проверили, что в путях, которые вы определяете, нет конфликта, основываясь на том, что вы поделились кодом эти два пути используют в одном методе (index ()) контроллера:
Route::get('/', ['middleware'=> 'auth', 'uses' =>'HomeController@index']);
Route::get('inicio', ['middleware'=> ['auth'], 'uses' =>'HomeController@index']);
Вы правы Иван 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*/
Это должно вернуться к 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');
App/Http/Middleware/RedirectIfAuthenticated.php
/ / в этой части вы устанавливаете, куда вы хотите, чтобы он привел вас после аутентификации
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/miruta');
}
return $next($request);
}
Для перенаправления в laravel 5.4
href="{{ url('/') }}"