繁体   English   中英

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

[英]Laravel If user is not logged redirect to login, after login redirect him to previous route

我有一条受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();
        }

    }

}

MY 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 administrator来重定向到/manage ,我仍然希望如此

您可以在您的中间件中使用它

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

更新请更新您的路线或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'));
}

如果您使用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);
}

您可以简单地使用它,

return Redirect::back();

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM