Hello artisan!
In this blog post we are going to see how to override fortify default login behavior when used with jestream.
Jetstream uses Laravel Fortify under the hood. Basically fortify uses the pipelines to route each request through series of classes and this class will take care of single task for the authenticated user. It will check where to redirect the user after the successful login or registration.
In this blog we will add alert message when user is authenticated. We can also redirect to different routes base on type of the users.
Now we are going to see how to override Fortify login.
Laravel\Fortify\Contracts\LoginResponse
class is the last step in authentication pipeline. Now we are going to override LoginResponse class with our own class.
To write our customized code first we need to create a Responses directory in App\Http\Responses
. After that create LoginResponse
this is the custom class in which we are going to override toResponse
method.
Add below code in LoginResponse
class
<?php
namespace App\Http\Responses;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
/**
* @param $request
* @return mixed
*/
public function toResponse($request)
{
return redirect()->back()->with('status', 'Login Successfull');
}
}
After that we have to bind our custom LoginResponse
in FortifyServiceProvider boot()
method, so it can override the default behavior provided by fortify.
add below code
<?php
namespace App\Providers;
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class FortifyServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// example to show flash msg after successful login
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
/* but if you want to redirect the user on different blade
*file based on the user's type then you can refer below code
*/
$home = auth()->user()->is_admin ?
'/admin-dashboard' :
'/dashboard';
return redirect()->intended($home);
}
}
In the above we have seen two ways to override the custom LoginResponse.
now in your login.blade.php
file add the below code, to show the flash/alert message after successful login.
@if (session('status'))
<div class="alert alert-success mb-3 rounded-0" role="alert">
{{ session('status') }}
</div>
@endif
We can also override/customized other fortify and jetstream feature in same way, the feature which can be customized is given in the vender
directory. Go to App\Providers
and open the FortifyServiceProvider registerResponseBindings()
method you can see customizable features.
Refer the below code.
<?php
namespace Laravel\Fortify;
// ...
class FortifyServiceProvider extends ServiceProvider
{
// ...
/**
* Register the response bindings.
*
* @return void
*/
protected function registerResponseBindings()
{
$this->app->singleton(FailedPasswordConfirmationResponseContract::class, FailedPasswordConfirmationResponse::class);
$this->app->singleton(FailedPasswordResetLinkRequestResponseContract::class, FailedPasswordResetLinkRequestResponse::class);
$this->app->singleton(FailedPasswordResetResponseContract::class, FailedPasswordResetResponse::class);
$this->app->singleton(FailedTwoFactorLoginResponseContract::class, FailedTwoFactorLoginResponse::class);
$this->app->singleton(LockoutResponseContract::class, LockoutResponse::class);
$this->app->singleton(LoginResponseContract::class, LoginResponse::class);
$this->app->singleton(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
$this->app->singleton(LogoutResponseContract::class, LogoutResponse::class);
$this->app->singleton(PasswordConfirmedResponseContract::class, PasswordConfirmedResponse::class);
$this->app->singleton(PasswordResetResponseContract::class, PasswordResetResponse::class);
$this->app->singleton(RegisterResponseContract::class, RegisterResponse::class);
$this->app->singleton(SuccessfulPasswordResetLinkRequestResponseContract::class, SuccessfulPasswordResetLinkRequestResponse::class);
}
}
Thank You for reading!!
🦄 🦄 🦁
Top comments (2)
thank for this, pls i have a question lest say i have 5 roles, superadmin, admin, accountant, hr, workers,
will i call all under the boot method without any if or ifelse statment ?
@youngswagx yes you can do that, make an array of all the roles, and check if the user role is available in an array... if yes the you can apply logic as per you need where to redirect that user (you can also make use of switch case under the if condition and pass the url to the common variable where you want to redirect the user after login).
Hope it helps you 😃