【问题标题】:Getting a Forbidden when trying to access my controller尝试访问我的控制器时被禁止
【发布时间】:2019-03-28 14:01:52
【问题描述】:

我创建了一个表单,提交时需要转到控制器函数。

在我提交表单的那一刻,我不断收到

禁止

您无权访问此服务器上的 /client_area/shop/payment-gateway。

此外,在尝试使用 ErrorDocument 处理请求时遇到 403 Forbidden 错误。

我以前做过表格,但这是第一次发生在我身上,我被难住了。

我的表格

<div class="payment-form">
    <form action="{{ route('payment.gateway') }}" method="POST">
        @csrf
        
        <input type="hidden" name="return_url" value="{{ route('payment.success') }}">
        <input type="hidden" name="cancel_url" value="{{ route('payment.cancel') }}"> 
        <input type="hidden" name="m_payment_id" value="{{ $invoice_number }}">
        <input type="hidden" name="amount" class="completePrice" value="">
        <input type="hidden" name="item_name" value="Test Item">
        <input type="hidden" name="item_description" value="A test product">

        <input type="hidden" name="delivery_collection" class="delivery_collection" value="">
        <input type="hidden" name="delivery_fee" class="delivery_fee" value="{{ $delivery }}">
        <input type="hidden" name="delivery_address" class="delivery_address" value="{{ $address }}">

        <button type="submit" class="btn btn-success float-right confirm-order">
            Confirm Order
        </button>
    </form>
</div>

我的路线

Route::group(['middleware' => ['web', 'auth']], function(){
    Route::get('/account/dashboard', 'UsersController@accountDashboard')->name('account.dashboard');
    Route::get('/account/details', 'UsersController@personalDetails')->name('account.details');
    Route::get('/account/track-orders', 'UsersController@trackOrders')->name('account.track-orders');
    Route::get('/account/invoices', 'UsersController@invoices')->name('account.invoices');
    Route::get('/account/address', 'UsersController@addressesIndex')->name('account.addresses.index');
    Route::get('/account/sort-orders', 'UsersController@sortOrders')->name('account.sort-orders');
    Route::get('/account/order-details/{invoice_number}', 'UsersController@orderDetails')->name('account.order-details');
    Route::get('/account/invoice-pdf/{id}', 'UsersController@invoicesPdf')->name('account.invoices.pdf');
    Route::get('/account/create-address', 'UsersController@createAddress')->name('account.create.address');
    Route::get('/account/edit-address/{id}', 'UsersController@editAddress')->name('account.edit.address');
    Route::get('/delivery-confirmation', 'PublicController@deliveryConfirmation')->name('cart.deliveryConfirmation');
    Route::get('/account/edit-delivery-address/{id}', 'UsersController@editDeliveryAddress')->name('account.edit.delivery.address');
    Route::get('/payment-success', 'PublicController@successPayment')->name('payment.success');
    Route::get('/payment-cancel', 'PublicController@cancelPayment')->name('payment.cancel');

    Route::post('/account/personal-details', 'UsersController@postPersonalDetails')->name('post.personal-details');
    Route::post('/account/business-details', 'UsersController@postBusinessDetails')->name('post.business-details');
    Route::post('/account/addresses-radio/{id}', 'UsersController@postAddressesRadio')->name('account.post.addresses.radio');
    Route::post('/account/create-address', 'UsersController@postAddress')->name('account.post.address');
    Route::post('/account/edit-address/{id}', 'UsersController@updateAddress')->name('account.update.address');
    Route::post('/payment-gateway', 'PublicController@paymentGateway')->name('payment.gateway');

    Route::delete('/account/delete-delivery-address/{id}', 'UsersController@deleteDeliveryAddress')->name('account.delete.delivery.address');
});

我只做了一个dd() 以确保我点击了正确的功能

public function paymentGateway()
{
    dd('this is a payment gateway');
}

我的身份验证中间件

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }
}

这是我在浏览网络选项卡时看到的。因为图片很多,所以我认为最好将其作为链接,然后将图片粘贴到此处。

Image 1

Image 2

Image 3

Image 4

Image 5

Image 6

Image 7

Image 8

【问题讨论】:

  • 您的项目配置正确吗?此项目中的其他表单是否按预期工作?
  • 是的,我所有的其他表格都可以正常工作。这就是我如此困惑的原因。

标签: laravel laravel-5


【解决方案1】:

Laravel 带有跨站点请求伪造保护。您还需要传递一个名为 csrf-token 的字段,如文档中所述。 https://laravel.com/docs/5.8/csrf#csrf-x-csrf-token

如果您不想要这种保护,您必须在 VerifyCsrfToken 中间件中包含路由以排除检查。 https://laravel.com/docs/5.8/csrf#csrf-excluding-uris

试试这个看看能不能解决你的问题。

【讨论】:

  • 我在我的网站上添加了&lt;meta name="csrf-token" content="{{ csrf_token() }}"&gt;,但它仍然不起作用
  • 尝试排除 csrf 检查,看看这是否是问题laravel.com/docs/5.8/csrf#csrf-excluding-uris。你是否仍然遇到同样的问题。
  • 另外,请将您的 web 和 auth 中间件包含在 stackoverflow 中,以便我了解它们是如何配置的。
  • 我没有接触过我的身份验证或网络中间件,我已将身份验证中间件添加到我的问题购买中,我不确定在哪里可以找到网络中间件
  • 你能看一下你发帖的时候csrf-token是否被传递给路由?使用浏览器中的网络标签。
猜你喜欢
  • 2020-03-01
  • 2015-08-20
  • 2021-02-24
  • 1970-01-01
  • 2019-12-27
  • 2018-12-17
  • 2013-05-25
  • 2019-07-12
  • 1970-01-01
相关资源
最近更新 更多