【问题标题】:Laravel route not calling function of controller after adding auth middleware添加身份验证中间件后,Laravel 路由未调用控制器的功能
【发布时间】:2021-10-28 18:53:45
【问题描述】:

添加 auth:api 中间件后,我的路由突然停止调用它应该调用的函数。当我删除中间件时,它又开始工作了。

api.php 路由

Route::middleware('auth:api')->get('/addloancontroller', [\App\Http\Controllers\AddLoan::class, 'store'])
    ->name('addLoan');

AddLoan.php 控制器

<?php

namespace App\Http\Controllers;

use App\Models\EarningsRecord;
use App\Models\Lender;
use App\Models\LoanLenders;
use App\Models\Loans;
use App\Models\Login;
use App\Providers\RouteServiceProvider;
use Illuminate\Http\Request;
use Auth;
use Illuminate\Support\Facades\DB;

class AddLoan extends Controller
{
    public function store(Request $request) {

        $request->validate([
            'amount' => 'required',
            'startDate' => 'required',
            'endDate' => 'required',
            'dateLoanSigned' => 'required',
            'interestRate' => 'required',
            'interestPaymentPeriod' => 'required',
            'interest_only_period' => 'required',
            'active' => 'required',
            'loanType' => 'required',
            'fName' => 'required',
            'lName' => 'required',
            'earnings' => 'required',
            'irdNum' => 'required',
            'bankAccNum' => 'required',
            'address' => 'required',
            'phone' => 'required',
        ]);

        $company_id = $request->user();
        dd($company_id);

        $loan = Loans::create([
            'companies_id' => $company_id,
            'amount' => $request->amount,
            'startDate' => $request->startDate,
            'endDate' => $request->endDate,
            'dateCreated' => $request->dateLoanSigned,
            'interestRate' => $request->interestRate,
            'interestPaymentPeriod' => $request->interestPaymentPeriod,
            'interestOnlyPeriod' => $request->interestOnlyPeriod,
            'active' => $request->active,
            'refinanced' => 0,
            'loanType' => $request->loanType
        ]);

        $loan->save();


        $lender = Lender::create([
            'fName' => $request->fName,
            'lName' => $request->lName,
            'annualEarnings' => $request->earnings,
            'irdNum' => $request->irdNum,
            'bankAccNum' => $request-> bankAccNum,
            'address' => $request-> address,
            'phone' => $request->phone,
            'loginID' => null
        ]);

        $lender->save();

        $taxAmount = DB::table('tax_rates')
                        ->where('minAmount', '<', $request->earnings)
                        ->where('maxAmount', '>', $request->earnings);

        $loanLender = LoanLenders::create([
            'loansID' => $loan->id,
            'lenderID' => $lender->id,
            'companyID' => $company_id,
            'taxAmount' => $taxAmount->id
        ]);

        $loanLender->save();

        $earningsReport = EarningsRecord::create([
            'lenderID' => $lender->id,
            'annualEarnings' => $lender->annualEarnings,
            'dateRecorded' => date('d-m-Y')
        ]);

        $earningsReport->save();

        return redirect(RouteServiceProvider::HOME);
    }
}

路由被称为表单中的动作:

<form method="GET" action="{{ route('addLoan') }}">

我的所有验证都只是寻找“必需”的原因是因为我想确保它不是验证失败并且只是不产生错误。

提交表单后会发生什么?

当我提交表单并且路由附加了中间件时,它只是将我重定向回主屏幕。

缓存

我已经跑了:

  • php artisan cache:clear
  • composer dump-autoload

身份验证令牌

正如 laravel 文档中所解释的,我已经将 api_token 列添加到用户的迁移文件中(在我的例子中,我使用登录模型进行身份验证)。下面是迁移文件中我添加该列的行:

$table->string('api_token', 80)->unique()->nullable()->default(null);

这是文档中的一行:

Schema::table('users', function ($table) {
    $table->string('api_token', 80)->after('password')
                        ->unique()
                        ->nullable()
                        ->default(null);
});

当我创建模型对象时,我通过这样做来制作经过身份验证的令牌:

'api_token' => Str::random(60)

当我检查数据库时,我看到 api_token 已成功添加,所以我不确定问题可能是什么。

(我使用的文档链接是here

【问题讨论】:

  • 您需要将令牌作为请求的一部分发送,因为它是用于确定您是否已通过身份验证的请求中的令牌。
  • 另外,你为什么在 store 上使用 get 方法,应该是 post。
  • 当我在测试时,我尝试了一切,看看它是否会改变任何东西,只是忘了把它改回帖子。还要感谢 cmets @Peppermintology,但我不确定如何在我的 addLoan 路线中做到这一点。
  • 我尝试按照文档进行操作,但在您的路线中看不到任何有关执行此操作的信息,而是使用 request 执行此操作并将返回值分配为变量:laravel.com/docs/5.8/…
  • &lt;form method="GET" action="{{ url('') }}/api/addloancontroller"&gt;你可以试试这个

标签: php laravel authentication laravel-middleware


【解决方案1】:

我建议在控制器中重构您的代码,这是我为您的方法创建的第一个 FormRequest,并将您的验证代码和规则移到那里。然后在FormRequest 方法authorize 中,我正在编写这样的代码:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return auth('auth:api')->check(); // Method check return false/true.
}

public function rules()
{
   return [
        'amount' => ['required'],
        'startDate' => ['required'],
        'endDate' => ['required'],
        'dateLoanSigned' => ['required'],
        'interestRate' => ['required'],
        'interestPaymentPeriod' => ['required'],
        'interest_only_period' => ['required'],
        'active' => ['required'],
        'loanType' => ['required'],
        'fName' => ['required'],
        'lName' => ['required'],
        'earnings' => ['required'],
        'irdNum' => ['required'],
        'bankAccNum' => ['required'],
        'address' => ['required'],
        'phone' => ['required']
   ];
}

另外,建议我将 HTTP 方法 GET 更改为 POST

【讨论】:

    【解决方案2】:

    您已经在 api 路由文件中定义了一个路由并使用 auth:api 中间件(通常是 Passport)对其进行保护,但是您从 HTML form 调用路由,这不是您的方式通常会使用api

    我假设你只是想保护通过应用程序中的网页访问的路由,因此我建议你研究一种基于 web 的 Laravel 身份验证机制,例如 Fortify 或者如果你不想滚动您自己的观点,JetstreamBreeze

    更新

    令牌与api 结合使用,您当前实施的工作流程(网络表单)是web 工作流程,因此不建议使用api tokens

    Auth 外观在控制器中可用,只要 user 已通过身份验证并且适用于 webapi 守卫。

    如果您安装BreezeJetstream,如果您刚刚开始安装Fortify,您将能够使用auth 中间件来保护需要users 的路由进行身份验证(登录)以访问受保护的路由。这意味着当 user 已通过身份验证并且您在控制器中处理请求时,Auth::id() 将返回经过身份验证的 iduser

    【讨论】:

    • 非常感谢您!我使用 auth:api 中间件的原因是因为我想在我的控制器中调用 Auth::id() 来获取当前登录的用户 ID,但它总是返回 null。所以我做了很多研究,人们说这是由于没有设置身份验证,我不得不使用 api_tokens。我只是不知道如何将 api_tokens 发送到控制器。
    • 非常感谢,将其更改为网络路由并使用 'auth' 而不是 'auth:api' 为我解决了这个问题!
    猜你喜欢
    • 2020-04-27
    • 2018-07-25
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多