Laravel Fortify 自定义身份验证重定向
Posted
技术标签:
【中文标题】Laravel Fortify 自定义身份验证重定向【英文标题】:Laravel Fortify Customize Authentication Redirect 【发布时间】:2021-01-12 09:03:31 【问题描述】:在 Laravel fortify 的自定义身份验证过程中,我无法重定向到带有错误消息的登录页面,而我们可以在 Auth 中执行此操作。 这是自定义文档链接:https://jetstream.laravel.com/1.x/features/authentication.html#customizing-the-authentication-process
if ($user && Hash::check($request->password, $user->password) && $user->status == 'active')
return $user;
elseif ($user->status == 'inactive')
//redirect with some error message to login blade
elseif ($user->status == 'blocked')
//redirect with some error message to login blade
请帮我解决这个问题。
【问题讨论】:
该方法仅用于返回用户,所以你不能在那里做任何重定向......你可以返回null
或false
,但你不会有任何自定义留言
但是在向用户返回消息的情况下,我如何在 fortify 中做到这一点?
【参考方案1】:
我理解您对文档(或缺少文档)的不满。我遇到了类似的问题,这就是我设法做到的:
if ($user && in_array($user->status_id, [1,2,3]))
if (Hash::check($request->password, $user->password))
return $user;
else
throw ValidationException::withMessages([
Fortify::username() => "Username not found or account is inactive. Please check your username.",
]);
https://github.com/laravel/fortify/issues/94#issuecomment-700777994
【讨论】:
这确实有助于在用户登录之前检查用户角色【参考方案2】:对于那些来自谷歌搜索并使用Laravel Jetstream
(使用 Fortify)的用户:
Laracasts answered this question 的 Snapey
并创建了一个 tutorial,它使用您自己的 LoginResponse
来覆盖默认登录行为。
我是这样制作的,但当然你应该根据自己的需要创建自己的。
// app/Http/Responses/LoginResponse.php
namespace App\Http\Responses;
use Illuminate\Support\Facades\Auth;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
/**
* @param $request
* @return mixed
*/
public function toResponse($request)
// replace this with your own code
// the user can be located with Auth facade
$home = Auth::user()->is_admin ? config('fortify.dashboard') : config('fortify.home');
return $request->wantsJson()
? response()->json(['two_factor' => false])
: redirect($home);
下一步它修改JetstreamServiceProvider
以使用你的LoginReponse
public function boot()
$this->configurePermissions();
Jetstream::deleteUsersUsing(DeleteUser::class);
// register new LoginResponse
$this->app->singleton(
\Laravel\Fortify\Contracts\LoginResponse::class,
\App\Http\Responses\LoginResponse::class
);
希望它能节省您的时间。
【讨论】:
【参考方案3】:对于只需要自定义 JSON 响应而不是默认 two_factor: false
的 SPA 应用程序。
创建一个实现 Fortify 的 LoginResponse
合约的自定义响应(在这种情况下,我将返回用户对象):
<?php
declare(strict_types=1);
namespace App\Http\Responses;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Symfony\Component\HttpFoundation\Response;
class LoginResponse implements LoginResponseContract
public function toResponse($request): Response
return response()->json(auth()->user());
在FortifyServiceProvider
的启动方法中加入这一行:
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
确保您已正确导入命名空间:
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
如果您仍未从服务器获取 JSON,请确保您的请求具有正确的标头。它应该是一个接受application/json
的 XHR 请求。
灵感来自 Laravel 新闻的 this 文章。
【讨论】:
【参考方案4】:在第 66 行转到 \config\fortify.php,将 home 值更改为您想要的任何路径
'home' => '/dashboard',
【讨论】:
【参考方案5】:例如 - 登录/注销/注册后的自定义重定向。通过请求参数-别名
在 FortifyServiceProvider 类中
添加。
use Laravel\Fortify\Contracts\LoginResponse;
use Laravel\Fortify\Contracts\LogoutResponse;
use Laravel\Fortify\Contracts\RegisterResponse;
然后在注册方法中。
$this->app->instance(LogoutResponse::class, new class implements LogoutResponse
public function toResponse($request)
return redirect('/'.$request->alias);
);
$this->app->instance(LoginResponse::class, new class implements LoginResponse
public function toResponse($request)
return redirect()->intended('/'.$request->alias.'/admin/dashboard');
);
$this->app->instance(RegisterResponse::class, new class implements RegisterResponse
public function toResponse($request)
return redirect('/'.$request->alias.'/admin/dashboard');
);
【讨论】:
【参考方案6】:目前,Fortify 无法自定义重定向。
这里有一个请求此行为的未解决问题:https://github.com/laravel/fortify/issues/77
很有可能会很快添加!
【讨论】:
以上是关于Laravel Fortify 自定义身份验证重定向的主要内容,如果未能解决你的问题,请参考以下文章