Laravel如果用户未登录重定向登录,则在登录后将其重定向到上一个路由

时间:2018-03-28 09:42:05

标签: php laravel

我有一条受Auth::check()保护的路线。因此,如果它通过,用户可以访问它,如果没有 - 用户是redirect()->route('login); 当用户输入他的凭证时,我想将他重定向回他试图实现的路线

我的登录控制器:

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Auth;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    public function __construct()
    {
        session(['url.intended' => url()->previous()]);
        $this->redirectTo = session()->get('url.intended');

        $this->middleware('guest')->except('logout');
    }

    protected function credentials(Request $request)
    {
        $data = $request->only($this->username(), 'password');
        $data['is_active'] = true;
        return $data;
    }

     public function redirectPath()
    {
        if (method_exists($this, 'redirectTo')) {
            return $this->redirectTo();
        }

    }

}

我的RedirectIfAuthenticated中间件:

<?php

namespace App\Http\Middleware;

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

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/');
        }

        return $next($request);
    }
}

现在可以工作,登录时,用户被重定向回来,但正因如此,我以前的功能中断了。无论如何,如果您已登录并有一个角色administratorsuperadministrator重定向到/manage

,我希望如此

3 个答案:

答案 0 :(得分:1)

您可以在中间件

中使用它
if (Auth::check() && (Auth::user()->int_role_id == Roles::ROLE_USER)) {
        return $next($request);
    }else if (!Auth::check() ){
        $url = Request()->path();
        Session::put('loginRedirect', $url);
        return redirect('/login');
    }

在您的登录控制器中执行此操作

if(Session::get('loginRedirect')){
    $url = Session::get('loginRedirect');
    Session::forget('loginRedirect');
    return Redirect::intended(url($url));
}
return Redirect::intended(route('user.get_home'));

更新请更新UR ROUTE或URL ...

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::check()) {
        return $next($request);
    }else if (!Auth::check() ){
        $url = Request()->path();
        Session::put('loginRedirect', $url);
        return redirect('YOUR LOGIN ROUTE OR URL');
    }
}

登录控制器

public function redirectPath()
{
    if(Session::get('loginRedirect')){
        $url = Session::get('loginRedirect');
        Session::forget('loginRedirect');
        return Redirect::intended(url($url));
    }
    return Redirect::intended(route('YOUR INTENDED URL OR ROUTE after user is logged in'));
}

答案 1 :(得分:1)

如果您自己使用Auth::check()来保护路线,请使用以下内容:

return redirect()->guest(route('login')); // Don't use redirect()->route('login)

而不是redirect()->route('login)。然后,在成功登录中,使用:

return redirect()->intended('/home'); // home is the default/fallback url

您可能需要根据路线声明更改默认网址。

更新:(问题编辑后):

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::check() && (Auth::user()->int_role_id == Roles::ROLE_USER)) {
        return $next($request);
    }

    return redirect()->guest(route('login'));
}

App\Http\Controllers\Auth\LoginController中,只需使用以下内容:

protected $redirectTo = '/home'; // this is default/fallback path

Laravel使用Illuminate\Foundation\Auth\AuthenticatesUsers::sendLoginResponse使用intended方法,因此您不需要做任何其他操作(希望您不使用非常旧的版本)。

OP

进行另一次编辑后再次更新

RedirectIfAuthenticated中,试试这个:

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        $user = Auth::user();
        // Replace the ? marks with appropriate value
        if ($user->int_role_id == ? || $user->int_role_id == ?) {
            return redirect('/manage');
        }
        return redirect('/');
    }

    return $next($request);
}

答案 2 :(得分:0)

你可以简单地使用它,

return Redirect::back();

如果您想使用某些消息或数据重定向,可以使用

return Redirect::back()->with();

with() 中,您可以传递任何消息或数据,例如

return Redirect::back()->with('message', 'Success');

这应该用于重定向到以前的位置。 back() 是Laravel辅助函数。此功能使用会话。