登录后策略拒绝不适用于 Inertia - laravel

问题描述 投票:0回答:1

我的 laravel + 惯性应用程序有问题。

假设我有这条路线:

Route::get('/tasks/{task}/apply/', [ApplicationController::class, 'create'])
        ->middleware('auth')
        ->name('applications.create');

如您所见,该路由受到身份验证中间件的保护。

在我的控制器中,我正在调用一个策略:

public function create(Task $task)
{
    Gate::authorize('create', [Application::class, $task]);
}

政策总是拒绝此示例的请求:

public function create(User $user, Task $task): Response
{
    return Response::deny('You are not allowed to apply to this task.');
}

我没有改变

AuthenticatedSessionController.php

/**
 * Handle an incoming authentication request.
  */
 public function store(LoginRequest $request): RedirectResponse
 {
    $request->authenticate();

    $request->session()->regenerate();

    return redirect()->intended(AppServiceProvider::HOME);
 }

如果我尝试访问受保护的路由,我希望我的 Laravel 应用程序表现如下。

  1. 我被重定向到登录页面
  2. 使用正确的凭据登录
  3. 我被重定向回预期路线
  4. 由于策略拒绝了我的请求,因此会呈现 403 错误页面而不是实际页面

应用程序会执行以下操作:

  1. 我被重定向到登录页面(如预期)
  2. 使用正确的凭据登录
  3. 我的浏览器地址栏仍然是登录uri
  4. 模态框打开,403 错误页面在模态框内呈现(没有重定向到预期路线。

由于模态打开,这对我来说看起来像是惯性问题。

在 Chrome 开发者工具中,这些是我的要求:

Request-Url:
http://127.0.0.1:8000/tasks/9c659414-220d-427a-ab16-3fea3a76fdcd/apply
Request-Method:
GET
Statuscode:
302 Found
Remote-Address:
127.0.0.1:8000
Guidelines for referrer URL:
strict-origin-when-cross-origin

Location: http://127.0.0.1:8000/login

Request-URL:
http://127.0.0.1:8000/login
Request-Method:
GET
Statuscode:
200 OK
Remote-Address:
127.0.0.1:8000
Guidelines for referrer URL:
strict-origin-when-cross-origin
Request-URL:
http://127.0.0.1:8000/login
Request-Method:
POST
Statuscode:
302 Found
Remote-Address:
127.0.0.1:8000
Guidelines for referrer URL:
strict-origin-when-cross-origin

Location: http://127.0.0.1:8000/tasks/9c659414-220d-427a-ab16-3fea3a76fdcd/apply

Request-URL:
http://127.0.0.1:8000/tasks/9c659414-220d-427a-ab16-3fea3a76fdcd/apply
Request-Method:
GET
Statuscode:
403 Forbidden
Remote-Address:
127.0.0.1:8000
Guidelines for referrer URL:
strict-origin-when-cross-origin

我该如何解决这个问题?

附加信息:

  • Laravel 版本:11.14.0
  • PHP版本:8.2.4
  • @inertiajs/vue3 版本:1.2.0

如果您需要更多信息,请告诉我

php laravel inertiajs
1个回答
0
投票

好的,现在可以了。但我不知道这是否适用于惯性重定向以外的某些情况:

/**
 * Handle an incoming authentication request.
 */
 public function store(LoginRequest $request): \Illuminate\Http\RedirectResponse | \Symfony\Component\HttpFoundation\Response
 {
    $request->authenticate();

    $request->session()->regenerate();

    // check if inertia request
    if ($request->inertia()) {
        return Inertia::location(redirect()->intended(AppServiceProvider::HOME)->getTargetUrl());
    } else {
        return redirect()->intended(AppServiceProvider::HOME);
    }
}

也许有人可以告诉我这是否正确?!

© www.soinside.com 2019 - 2024. All rights reserved.