SK *_*oke 3 authentication redirect laravel fortify laravel-8
在 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
}
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。
例如 - 登录/注销/注册后自定义重定向。通过请求参数-别名
在 FortifyServiceProvider 类中
添加。
use Laravel\Fortify\Contracts\LoginResponse;
use Laravel\Fortify\Contracts\LogoutResponse;
use Laravel\Fortify\Contracts\RegisterResponse;
Run Code Online (Sandbox Code Playgroud)
然后在register方法中。
$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');
}
});
Run Code Online (Sandbox Code Playgroud)
我理解您对文档(或缺少文档)感到沮丧。我遇到了类似的问题,这就是我设法做到的:
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.",
]);
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/laravel/fortify/issues/94#issuecomment-700777994
对于只需要自定义 JSON 响应而不是默认{two_factor: false}.
创建一个实现LoginResponseFortify 合约的自定义响应(在本例中我返回用户对象):
<?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());
}
}
Run Code Online (Sandbox Code Playgroud)
将此行添加到以下的启动方法中FortifyServiceProvider:
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
Run Code Online (Sandbox Code Playgroud)
确保您已正确导入名称空间:
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
Run Code Online (Sandbox Code Playgroud)
如果您仍然没有从服务器获取 JSON,请确保您的请求具有正确的标头。它应该是一个接受的 XHR 请求application/json。
受到 Laravel News这篇文章的启发。
小智 5
对于那些使用Laravel Jetstream(使用 Fortify)的google 搜索的人:
SnapeyLaracasts回答了这个问题并制作了一个教程,该教程使用您自己的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);
}
}
Run Code Online (Sandbox Code Playgroud)
下一步它要修改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
);
}
Run Code Online (Sandbox Code Playgroud)
希望它可以节省您的时间。
| 归档时间: |
|
| 查看次数: |
9499 次 |
| 最近记录: |