如何在查询字符串中捕获受保护页面的URL?

时间:2019-07-11 10:03:53

标签: php laravel laravel-5.6

当我尝试为问题打下基础时,请提防我一秒钟。

因此,我已经使用Python网络框架Flask接近一年了,它具有一个出色的扩展名Flask-Login,可帮助在laravel中提供类似于this的用户会话管理。

话虽如此,Flask-Login中有一项功能可以提供以下功能:当用户未登录或登录并尝试访问需要进行身份验证的页面时,例如{{1} },它们将被重定向回登录页面,并以查询字符串(如/create_post这样的编码形式编码该页面。

我正在尝试在正在开发的laravel项目中实现相同的功能,因此我可以将用户重定向到他们可能首先想访问的页面,或者重定向到其他路由(以防查询字符串不起作用)存在,而且似乎无法找到将代码放置在何处的功能,而且我也不想弄乱/login?next=%2Fcreate_post目录中的任何内容(由于随之而来的明显问题),我已经尝试过通过执行以下操作但未成功操作文件vendor

app/Http/Middleware/RedirectIfAuthenticated.php

我是否必须创建自己的中间件,还是有另一种在laravel中实现这种功能的方法?

注意::我没有使用默认的laravel身份验证系统。我创建了自己的控制器public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { return redirect('/'); } $previous_url = url()->previous(); // how do I insert this in query string return $next($request); } 来处理包含以下代码的登录。

SessionsController

谢谢。

1 个答案:

答案 0 :(得分:0)

即使我没有按照自己的意愿使用查询字符串,我还是设法解决了一些问题。

我创建了一个辅助函数get_previous_url,如下所示

/**
 * Gets the previous url
 * 
 * @return null|string
 */
function get_previous_url()
{
    $host = $_SERVER['HTTP_HOST'];
    $previous_url = url()->previous();

    // check if previous url is from the same host
    if (!str_contains($previous_url, $host)) {
        return null;
    }

    // get the previous url route
    list(, $route) = explode($host, $previous_url);

    // make sure the route is not the index, login or logout route
    if (in_array(substr($route, 1), ['', 'login', 'logout'])) {
        $route = '';
    }

    return $route;
}

然后我通过执行此操作在 create方法中的SessionsController类中调用了同一函数

public function create()
{
    $previous_url =  get_previous_url();
    if ($previous_url) {
        session(['previous_url' => $previous_url]);
    }

    ... 
}

然后将我的登录方法更改为

public function login(Request $request)
{
    ...

    $redirect = redirect()->route('dashboard'); // '/'
    if (session()->has('previous_url')) {
        $redirect = redirect(session()->pull('previous_url'));
    }

    return $redirect;
}