php - 如何在查询字符串中捕获受保护页面的 url?
问题描述
当我试图为我的问题奠定背景时,请注意我。
所以我使用 Python Web 框架Flask 快一年了,它有一个很棒的扩展,叫做Flask-Login ,可以帮助在 laravel中提供类似这样的用户会话管理。
说了这么多,Flask-Login 中有一个特定的功能,它提供的功能是,当用户没有登录或登录并尝试访问需要验证的页面时/create_post
,他们将被重定向回登录页面,该页面在查询字符串中编码,例如/login?next=%2Fcreate_post
.
我正在尝试在正在开发的 laravel 项目中实现相同的功能,这样我就可以将用户重定向到他们可能想首先访问的页面,或者在查询字符串不存在的情况下重定向到不同的路由,而我似乎找不到将我的代码放在哪里来做到这一点,我不想弄乱vendor
目录中的任何东西(因为随之而来的明显问题),我尝试app/Http/Middleware/RedirectIfAuthenticated.php
通过执行以下操作来操作文件但没有成功。
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);
}
我是否必须创建自己的中间件,或者是否有另一种方法可以在 laravel 中实现这种功能?
注意:我没有使用默认的 laravel 身份验证系统。我创建了自己的控制器SessionsController
来处理包含以下代码的登录。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
class SessionsController extends Controller
{
public function __construct()
{
$this->middleware('auth')->except(['create', 'login']);
}
public function create()
{
$data = [
'title' => 'Login',
'body_class' => 'hold-transition login-page',
];
return view('auth.login', $data);
}
public function login(Request $request)
{
$this->validate($request, [
'username' => 'required',
'password' => 'required',
]);
$user = User::checkCredentials($request->username, $request->password);
if (!$user) {
return back()->with([
'class' => 'alert-danger',
'message' => 'Please check your credentials',
]);
}
// set session active flag to true
$user->session_active = true;
$user->save();
auth()->login($user);
return redirect()->route('dashboard');
}
public function destroy()
{
$user = auth()->user();
$user->last_login = date('Y-m-d H:i:s');
$user->session_active = false;
$user->save();
auth()->logout();
return redirect()->route('login')->with([
'class' => 'alert-success',
'message' => 'You logged out successfully',
]);
}
}
谢谢你。
解决方案
即使我没有使用我想要的查询字符串,我也设法在一定程度上解决了我的问题。
我创建了一个辅助函数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;
}
然后我通过这样做在我的SessionsController
类中的create 方法中调用了相同的函数
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;
}