Невозможно выйти с laravel 6 с запросом POST - PullRequest
1 голос
/ 28 апреля 2020

Я прочитал, что использование запроса get для выхода из системы может привести к атаке csrf, поэтому я хочу реализовать запрос post для выхода из системы.

Вот что я сделал в сети. php

Route::redirect('/', '/it');

Route::group(['prefix' => '{locale?}'], function () {
    Route::get('/','HomeController@index')->name('/');
...
    Route::get('/admin/dashboard', 'AdminViewController@index')->name('dashboard')->middleware('auth')
...
    Route::get('/contact', 'ContactController@index')->name('contact');
    // Route::get('logout', function()
    // {
    //     auth()->logout();
    //     Session()->flush();
    //     return Redirect::to('/');
    // })->name('logout');

    Auth::routes();

});

Я знаю, что люди говорят, чтобы удалить Auth из группы, но для меня это хорошо.

Вот что у меня в AuthRouteMethods, который автоматически создает:

<?php

namespace Laravel\Ui;

use Illuminate\Support\Facades\Route;

class AuthRouteMethods
{

    public function auth()
    {
        return function ($options = []) {
            // Authentication Routes...
            $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
            $this->post('login', 'Auth\LoginController@login');
            $this->post('logout', 'Auth\LoginController@logout')->name('logout');

            // Registration Routes...
            if ($options['register'] ?? true) {
                $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
                $this->post('register', 'Auth\RegisterController@register');
            }

            // Password Reset Routes...
            if ($options['reset'] ?? true) {
                $this->resetPassword();
            }

            // Password Confirmation Routes...
            if ($options['confirm'] ??
                class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))) {
                $this->confirmPassword();
            }

            // Email Verification Routes...
            if ($options['verify'] ?? false) {
                $this->emailVerification();
            }
        };
    }


    public function resetPassword()
    {
        return function () {
            $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
            $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
            $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
            $this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');
        };
    }

    public function confirmPassword()
    {
        return function () {
            $this->get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm')->name('password.confirm');
            $this->post('password/confirm', 'Auth\ConfirmPasswordController@confirm');
        };
    }


    public function emailVerification()
    {
        return function () {
            $this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
            $this->get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
            $this->post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
        };
    }
}

и в пользовательском интерфейсе у меня есть эта реализация:

                        <li><a href="{{ route('logout', app()->getLocale()) }}" onclick="event.preventDefault(); document.getElementById('loggout-form').submit();">Logout</a>

                      </ul>
                    </div>

                <form id="loggout-form" {{ route('logout', app()->getLocale()) }} method="POST" style="display:none;">
                    @csrf
                </form>

и когда я запускаю вызов, я получил эту ошибку:

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException

**The POST method is not supported for this route. Supported methods: GET, HEAD.** 

1 Ответ

1 голос
/ 28 апреля 2020

Вы должны определить свой маршрут выхода из сети. php как показано ниже. Он создаст следующий маршрут:

POST | logout | App\Http\Controllers\Auth\LoginController@logout

Вам необходимо выйти из системы, используя форму POST. Таким образом, вам также понадобится токен CSRF, который рекомендуется.

<form method="POST" action="{{ route('logout') }}">
  @csrf
  <button type="submit">Logout</button>
</form>
...