在Laravel 5中进行身份验证后重定向

时间:2016-04-05 13:39:52

标签: php laravel redirect

我想在Laravel 5成功登录后将用户重定向回登录页面之前正在查看的页面。目前,如果用户写错了用户名/密码,他会再次被重定向到登录页面,并显示错误,而且我想保持这种方式。此外,我希望在用户单击页面上的登录按钮时以及用户自动重定向到登录页面的情况下工作。

对我而言

protected $redirectTo = "/";

是关键所在,但我不知道如何将其转到#34;重定向到最后一页,而不是登录页面"。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:0)

在您的重定向中使用URL :: previous()或在您知道登录成功后使用return redirect()->back();

此外,您可以将URL保存在会话中,并在以后随时使用。

答案 1 :(得分:0)

$url = URL::previous() != url('login') ? URL::previous() : null;
$previousUrl = old('previousUrl', $url);

$previousUrl传递到您的登录视图。

在您的登录视图中,添加previousUrl字段:<input type="hidden" name="previousUrl" value="{{$previousUrl}}"/>

在您的AuthController.php更新构造函数中:

public function __construct()
{
    $this->redirectTo = app('request')->input('previousUrl') ? : $this->redirectTo;
    <...>
}

未经测试,但应该可以使用。

答案 2 :(得分:0)

Laravel 5.2

当用户进入您的登录页面时,您必须存储以前的URL: https://laravel.com/docs/5.2/helpers#method-url

会话是一个选项:https://laravel.com/docs/5.2/helpers#method-session

之后,当用户尝试登录时,您应该使用该信息填充$ redirectTo:https://laravel.com/docs/5.2/authentication#included-authenticating

我使用中间件编写了一个示例。

首先你需要创建一个:

php artisan make:middleware BeforeLoginForm

现在我们需要覆盖Auth \ AuthController @ showLoginForm的默认路由,这样我们就可以将中间件添加到该路由中:

应用程序/ HTTP / routes.php文件

Route::auth();

$this->get('login', 'Auth\AuthController@showLoginForm')
    ->middleware('before.loginform');

为我们的中间件定义别名:

应用程序/ HTTP / Kernel.php

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'before.loginform' => \App\Http\Middleware\BeforeLoginForm::class,
];

我们的中间件将使用会话助手存储以前的URL:

应用程序/ HTTP /中间件/ BeforeLoginForm.php     

namespace App\Http\Middleware;

use Closure;

class BeforeLoginForm
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        session()->put('before_login_url', url()->previous());
        return $next($request);
    }
}

我们的AuthController的构造函数将使用我们先前存储的URL更改redirectTo属性:

应用程序/ HTTP /控制器/认证/ AuthController.php

<?php

namespace App\Http\Controllers\Auth;

class AuthController extends Controller
{

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $redirectTo = session()->get('before_login_url');
        if (!empty($redirectTo)) {
            $this->redirectTo = $redirectTo;
        }
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }

对于Laravel 5.0(只有不同​​之处)

您应该像这样注册您的路线:

应用程序/ HTTP / routes.php文件

Route::get('/', 'WelcomeController@index');
Route::get('home', 'HomeController@index');
Route::controllers([
        'auth' => 'Auth\AuthController',
        'password' => 'Auth\PasswordController',
]);

Route::get('auth/login', [
    'middleware' => 'before.loginform',
    'uses' => 'Auth\AuthController@getLogin'
]);

然后在AuthController上修改redirectTo:

应用程序/ HTTP /控制器/认证/ AuthController.php

public function __construct(Guard $auth, Registrar $registrar)
{
    $this->auth = $auth;
    $this->registrar = $registrar;

    $redirectTo = session()->get('before_login_url');
    if (!empty($redirectTo)) {
        $this->redirectTo = $redirectTo;
    }

    $this->middleware('guest', ['except' => 'getLogout']);
}

我无法测试,稍后会这样做。

  

请注意,因为属性“redirectTo”的值不仅会影响身份验证,还会影响注册过程。

答案 3 :(得分:0)

Laravel允许您覆盖通常使用redirectPath()属性的AuthController中的redirectTo方法,但您可以将其设置为动态内容。

public function redirectPath()
{
    return request('redirect');
}

在登录刀片模板中放置一个隐藏的input

<input type="hidden" name="redirect" value="{{ url()->previous() }}">

答案 4 :(得分:0)

尝试:

post_detal