Как мне захватить URL защищенной страницы в строке запроса? - PullRequest
0 голосов
/ 11 июля 2019

Остерегайтесь меня на секунду, когда я пытаюсь заложить основу для моей проблемы.

Итак, я использовал веб-фреймворк python 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',
        ]);
    }
}

Спасибо.

1 Ответ

0 голосов
/ 11 июля 2019

Мне удалось несколько решить мою проблему, хотя я и не использовал строки запроса так, как хотел.

Я создаю вспомогательную функцию 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 классе в метод создания , выполнив это

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...