Laravel强化自定义身份验证重定向



在Laravel强化自定义身份验证过程中,我无法重定向到带有错误消息的登录页面,这是我们在Auth中能够做到的。以下是定制文档链接:https://jetstream.laravel.com/1.x/features/authentication.html#customizing-认证过程

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
}

请帮我解决这个问题。

对于来自谷歌搜索的使用Laravel Jetstream(使用Fortify(的用户:Laracasts的Snapey回答了这个问题,并制作了一个教程,使用您自己的LoginResponse来覆盖默认登录行为。

我是这样做的,但你当然应该根据自己的需要创造自己的。

// app/Http/Responses/LoginResponse.php
namespace AppHttpResponses;
use IlluminateSupportFacadesAuth;
use LaravelFortifyContractsLoginResponse 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(
LaravelFortifyContractsLoginResponse::class,
AppHttpResponsesLoginResponse::class
);
}

希望它能帮你节省时间。

我理解您对文档的不满(或缺乏文档(。我也遇到过类似的问题,这就是我如何做到的:

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

对于只需要自定义JSON响应而不是默认{two_factor: false}的SPA应用程序。

创建一个实现Fortify的LoginResponse合约的自定义响应(在本例中,我返回用户对象(:

<?php
declare(strict_types=1);
namespace AppHttpResponses;
use LaravelFortifyContractsLoginResponse as LoginResponseContract;
use SymfonyComponentHttpFoundationResponse;
class LoginResponse implements LoginResponseContract
{
public function toResponse($request): Response
{
return response()->json(auth()->user());
}
}

将此行添加到FortifyServiceProvider:的引导方法中

$this->app->singleton(LoginResponseContract::class, LoginResponse::class);

确保您已正确导入命名空间:

use AppHttpResponsesLoginResponse;
use LaravelFortifyContractsLoginResponse as LoginResponseContract;

如果您仍然没有从服务器获得JSON,请确保您的请求具有正确的标头。它应该是一个接受application/json的XHR请求。

灵感来自Laravel News的这篇文章。

例如-登录/注销/注册后自定义重定向。按请求参数-别名

在FortifyServiceProvider类中

添加。

use LaravelFortifyContractsLoginResponse;
use LaravelFortifyContractsLogoutResponse;
use LaravelFortifyContractsRegisterResponse;

然后在寄存器方法。

$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');
}
});

goto\config\reinforce.php在第66行,将home值更改为您想要的的任何路径

'home'=>'/仪表板,

目前,Fortify没有自定义重定向的方法。

这里有一个悬而未决的问题需要这个bahavior:https://github.com/laravel/fortify/issues/77

这很有可能很快就会被添加!

最新更新