Last active
October 11, 2023 18:33
-
-
Save bulentsakarya/b8cd25ad24c7cc87fe2e22a819ae4d2d to your computer and use it in GitHub Desktop.
Laravel 10 Breeze Multi Guard
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Models\Admin; | |
use Illuminate\Contracts\Auth\MustVerifyEmail; | |
use Illuminate\Database\Eloquent\Factories\HasFactory; | |
use Illuminate\Foundation\Auth\User as Authenticatable; | |
use Illuminate\Notifications\Notifiable; | |
use Laravel\Sanctum\HasApiTokens; | |
class Admin extends Authenticatable implements MustVerifyEmail | |
{ | |
use HasApiTokens, HasFactory, Notifiable; | |
protected $guard = 'admin'; | |
/** | |
* The attributes that are mass assignable. | |
* | |
* @var array<int, string> | |
*/ | |
protected $fillable = [ | |
'name', | |
'email', | |
'password', | |
]; | |
/** | |
* The attributes that should be hidden for serialization. | |
* | |
* @var array<int, string> | |
*/ | |
protected $hidden = [ | |
'password', | |
'remember_token', | |
]; | |
/** | |
* The attributes that should be cast. | |
* | |
* @var array<string, string> | |
*/ | |
protected $casts = [ | |
'email_verified_at' => 'datetime', | |
]; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use App\Http\Controllers\Admin\Auth\AuthenticatedSessionController; | |
use App\Http\Controllers\Admin\Auth\ConfirmablePasswordController; | |
use App\Http\Controllers\Admin\Auth\EmailVerificationNotificationController; | |
use App\Http\Controllers\Admin\Auth\EmailVerificationPromptController; | |
use App\Http\Controllers\Admin\Auth\NewPasswordController; | |
use App\Http\Controllers\Admin\Auth\PasswordController; | |
use App\Http\Controllers\Admin\Auth\PasswordResetLinkController; | |
use App\Http\Controllers\Admin\Auth\RegisteredUserController; | |
use App\Http\Controllers\Admin\Auth\VerifyEmailController; | |
use App\Http\Controllers\Admin\ProfileController; | |
use Illuminate\Support\Facades\Artisan; | |
use Illuminate\Support\Facades\Route; | |
/* | |
|-------------------------------------------------------------------------- | |
| Web Routes | |
|-------------------------------------------------------------------------- | |
| | |
| Here is where you can register web routes for your application. These | |
| routes are loaded by the RouteServiceProvider and all of them will | |
| be assigned to the "web" middleware group. Make something great! | |
| | |
*/ | |
Route::redirect('/panel', '/panel/login'); | |
Route::middleware(['guest:admin'])->prefix('panel')->name('panel.')->group(function () { | |
Route::controller(AuthenticatedSessionController::class)->group(function () { | |
Route::get('/login', 'create')->name('login'); | |
Route::post('/login', 'store')->name('login.store'); | |
}); | |
Route::controller(RegisteredUserController::class)->group(function () { | |
Route::get('/register', 'create')->name('register'); | |
Route::post('/register', 'store')->name('register.store'); | |
}); | |
Route::controller(PasswordResetLinkController::class)->group(function () { | |
Route::get('/forgot-password', 'create')->name('forgot.password'); | |
Route::post('/forgot-password', 'store')->name('forgot.password.store'); | |
}); | |
Route::controller(NewPasswordController::class)->group(function () { | |
Route::get('/reset-password/{token}', 'create')->name('password.reset'); | |
Route::post('/reset-password', 'store')->name('password.reset.store'); | |
}); | |
}); | |
Route::middleware(['auth:admin', 'auth.session'])->prefix('panel')->name('panel.')->group(function () { | |
Route::get('/verify-email', EmailVerificationPromptController::class)->name('verification.notice'); | |
Route::middleware(['signed', 'throttle:6,1'])->group(function () { | |
Route::get('/verify-email/{id}/{hash}', VerifyEmailController::class)->name('verification.verify'); | |
}); | |
Route::middleware('throttle:6,1')->controller(EmailVerificationNotificationController::class)->group(function () { | |
Route::post('/email/verification-notification', 'store')->name('verification.send'); | |
}); | |
}); | |
Route::middleware(['auth:admin', 'auth.session', 'verified'])->prefix('panel')->name('panel.')->group(function () { | |
Route::get('dashboard', function () { | |
return view('admin.dashboard'); | |
})->name('dashboard'); | |
Route::controller(ProfileController::class)->group(function () { | |
Route::get('/profile', 'edit')->name('profile.edit'); | |
Route::patch('/profile', 'update')->name('profile.update'); | |
Route::delete('/profile', 'destroy')->name('profile.destroy'); | |
}); | |
Route::controller(ConfirmablePasswordController::class)->group(function () { | |
Route::get('/confirm-password', 'show')->name('password.confirm'); | |
Route::post('/confirm-password', 'store'); | |
}); | |
Route::controller(PasswordController::class)->group(function () { | |
Route::put('/password', 'update')->name('password.update'); | |
}); | |
Route::controller(AuthenticatedSessionController::class)->group(function () { | |
Route::post('/logout', 'destroy')->name('logout'); | |
}); | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//config/auth.php | |
<?php | |
return [ | |
/* | |
|-------------------------------------------------------------------------- | |
| Authentication Defaults | |
|-------------------------------------------------------------------------- | |
| | |
| This option controls the default authentication "guard" and password | |
| reset options for your application. You may change these defaults | |
| as required, but they're a perfect start for most applications. | |
| | |
*/ | |
'defaults' => [ | |
'guard' => 'user', | |
'passwords' => 'users', | |
], | |
/* | |
|-------------------------------------------------------------------------- | |
| Authentication Guards | |
|-------------------------------------------------------------------------- | |
| | |
| Next, you may define every authentication guard for your application. | |
| Of course, a great default configuration has been defined for you | |
| here which uses session storage and the Eloquent user provider. | |
| | |
| All authentication drivers have a user provider. This defines how the | |
| users are actually retrieved out of your database or other storage | |
| mechanisms used by this application to persist your user's data. | |
| | |
| Supported: "session" | |
| | |
*/ | |
'guards' => [ | |
'user' => [ | |
'driver' => 'session', | |
'provider' => 'users', | |
], | |
'admin' => [ | |
'driver' => 'session', | |
'provider' => 'admins', | |
], | |
], | |
/* | |
|-------------------------------------------------------------------------- | |
| User Providers | |
|-------------------------------------------------------------------------- | |
| | |
| All authentication drivers have a user provider. This defines how the | |
| users are actually retrieved out of your database or other storage | |
| mechanisms used by this application to persist your user's data. | |
| | |
| If you have multiple user tables or models you may configure multiple | |
| sources which represent each model / table. These sources may then | |
| be assigned to any extra authentication guards you have defined. | |
| | |
| Supported: "database", "eloquent" | |
| | |
*/ | |
'providers' => [ | |
'users' => [ | |
'driver' => 'eloquent', | |
'model' => App\Models\User\User::class, | |
], | |
'admins' => [ | |
'driver' => 'eloquent', | |
'model' => App\Models\Admin\Admin::class, | |
], | |
// 'users' => [ | |
// 'driver' => 'database', | |
// 'table' => 'users', | |
// ], | |
], | |
/* | |
|-------------------------------------------------------------------------- | |
| Resetting Passwords | |
|-------------------------------------------------------------------------- | |
| | |
| You may specify multiple password reset configurations if you have more | |
| than one user table or model in the application and you want to have | |
| separate password reset settings based on the specific user types. | |
| | |
| The expiry time is the number of minutes that each reset token will be | |
| considered valid. This security feature keeps tokens short-lived so | |
| they have less time to be guessed. You may change this as needed. | |
| | |
| The throttle setting is the number of seconds a user must wait before | |
| generating more password reset tokens. This prevents the user from | |
| quickly generating a very large amount of password reset tokens. | |
| | |
*/ | |
'passwords' => [ | |
'users' => [ | |
'provider' => 'users', | |
'table' => 'password_reset_tokens', | |
'expire' => 60, | |
'throttle' => 60, | |
], | |
'admins' => [ | |
'provider' => 'admins', | |
'table' => 'password_reset_tokens', | |
'expire' => 60, | |
'throttle' => 60, | |
], | |
], | |
/* | |
|-------------------------------------------------------------------------- | |
| Password Confirmation Timeout | |
|-------------------------------------------------------------------------- | |
| | |
| Here you may define the amount of seconds before a password confirmation | |
| times out and the user is prompted to re-enter their password via the | |
| confirmation screen. By default, the timeout lasts for three hours. | |
| | |
*/ | |
'password_timeout' => 10800, | |
]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers\Admin\Auth; | |
use App\Http\Controllers\Controller; | |
use App\Providers\RouteServiceProvider; | |
use Illuminate\Http\RedirectResponse; | |
use Illuminate\Http\Request; | |
use Illuminate\Support\Facades\Auth; | |
class EmailVerificationNotificationController extends Controller | |
{ | |
/** | |
* Send a new email verification notification. | |
*/ | |
public function store(Request $request): RedirectResponse | |
{ | |
if ($request->user()->hasVerifiedEmail()) { | |
return redirect()->intended(RouteServiceProvider::ADMIN_HOME); | |
} | |
$request->user()->sendEmailVerificationNotification(); | |
return back()->with('status', 'verification-link-sent'); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers\Admin\Auth; | |
use App\Http\Controllers\Controller; | |
use App\Providers\RouteServiceProvider; | |
use Illuminate\Http\RedirectResponse; | |
use Illuminate\Http\Request; | |
use Illuminate\Support\Facades\Auth; | |
use Illuminate\View\View; | |
class EmailVerificationPromptController extends Controller | |
{ | |
/** | |
* Display the email verification prompt. | |
*/ | |
public function __invoke(Request $request): RedirectResponse|View | |
{ | |
return $request->user()->hasVerifiedEmail() | |
? redirect()->intended(RouteServiceProvider::ADMIN_HOME) | |
: view('admin.auth.verify-email'); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers\Admin\Auth; | |
use App\Http\Controllers\Controller; | |
use App\Models\Admin\Admin; | |
use App\Providers\RouteServiceProvider; | |
use Illuminate\Auth\Events\Registered; | |
use Illuminate\Http\RedirectResponse; | |
use Illuminate\Http\Request; | |
use Illuminate\Support\Facades\Auth; | |
use Illuminate\Support\Facades\Hash; | |
use Illuminate\Validation\Rules; | |
use Illuminate\View\View; | |
class RegisteredUserController extends Controller | |
{ | |
/** | |
* Display the registration view. | |
*/ | |
public function create(): View | |
{ | |
return view('admin.auth.register'); | |
} | |
/** | |
* Handle an incoming registration request. | |
* | |
* @throws \Illuminate\Validation\ValidationException | |
*/ | |
public function store(Request $request): RedirectResponse | |
{ | |
$request->validate([ | |
'name' => ['required', 'string', 'max:255'], | |
'email' => ['required', 'string', 'email', 'max:255', 'unique:'.Admin::class], | |
'password' => ['required', 'confirmed', Rules\Password::defaults()], | |
]); | |
$admin = Admin::create([ | |
'name' => $request->name, | |
'email' => $request->email, | |
'password' => Hash::make($request->password), | |
]); | |
event(new Registered($admin)); | |
Auth::guard('admin')->login($admin); | |
return redirect(RouteServiceProvider::ADMIN_HOME); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers\Admin\Auth; | |
use App\Http\Controllers\Controller; | |
use App\Providers\RouteServiceProvider; | |
use Illuminate\Auth\Events\Verified; | |
use Illuminate\Foundation\Auth\EmailVerificationRequest; | |
use Illuminate\Http\RedirectResponse; | |
use Illuminate\Support\Facades\Auth; | |
class VerifyEmailController extends Controller | |
{ | |
/** | |
* Mark the authenticated user's email address as verified. | |
*/ | |
public function __invoke(EmailVerificationRequest $request): RedirectResponse | |
{ | |
if ($request->user()->hasVerifiedEmail()) { | |
return redirect()->intended(RouteServiceProvider::ADMIN_HOME.'?verified=1'); | |
} | |
if ($request->user()->markEmailAsVerified()) { | |
event(new Verified($request->user())); | |
} | |
return redirect()->intended(RouteServiceProvider::ADMIN_HOME.'?verified=1'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment