Kritim Yantra
Jan 08, 2026
“I’ll just add login first… I’ll worry about admin later.”
Fast forward a few days, and suddenly:
I’ve been there. I learned this the hard way.
In this guide, we’ll build separate login and registration systems for Admins and Normal Users in Laravel 12, using:
No confusion. No hacks. Just clean Laravel.
By the end, you’ll have:
/login & /register → Normal users/admin/login & /admin/register → AdminsUser model (simple and practical)Think of it like a building:
We’ll use one users table, with a role field.
For beginners:
users table exampleSchema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->string('role')->default('user'); // user | admin
$table->timestamps();
});
Rule
role = user → normal userrole = admin → adminapp/Models/User.php
class User extends Authenticatable
{
protected $fillable = [
'name',
'email',
'password',
'role',
];
protected $hidden = [
'password',
];
public function isAdmin()
{
return $this->role === 'admin';
}
}
This small helper method will save you time later.
All routes go in routes/web.php.
use App\Http\Controllers\Auth\UserAuthController;
Route::get('/register', [UserAuthController::class, 'showRegister']);
Route::post('/register', [UserAuthController::class, 'register']);
Route::get('/login', [UserAuthController::class, 'showLogin']);
Route::post('/login', [UserAuthController::class, 'login']);
use App\Http\Controllers\Auth\AdminAuthController;
Route::prefix('admin')->group(function () {
Route::get('/register', [AdminAuthController::class, 'showRegister']);
Route::post('/register', [AdminAuthController::class, 'register']);
Route::get('/login', [AdminAuthController::class, 'showLogin']);
Route::post('/login', [AdminAuthController::class, 'login']);
});
They clearly separate:
/login → users/admin/login → adminsLess confusion. Better security.
php artisan make:controller Auth/UserAuthController
php artisan make:controller Auth/AdminAuthController
class UserAuthController extends Controller
{
public function showRegister()
{
return view('auth.user.register');
}
public function register(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
]);
User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
'role' => 'user',
]);
return redirect('/login');
}
public function showLogin()
{
return view('auth.user.login');
}
public function login(Request $request)
{
if (auth()->attempt($request->only('email', 'password'))) {
return redirect('/dashboard');
}
return back()->withErrors(['email' => 'Invalid credentials']);
}
}
class AdminAuthController extends Controller
{
public function showRegister()
{
return view('auth.admin.register');
}
public function register(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users',
'password' => 'required|min:6',
]);
User::create([
'name' => $request->name,
'email' => $request->email,
'password' => bcrypt($request->password),
'role' => 'admin',
]);
return redirect('/admin/login');
}
public function showLogin()
{
return view('auth.admin.login');
}
public function login(Request $request)
{
if (
auth()->attempt($request->only('email', 'password')) &&
auth()->user()->isAdmin()
) {
return redirect('/admin/dashboard');
}
auth()->logout();
return back()->withErrors(['email' => 'Admin access only']);
}
}
resources/views/auth/
├── admin/
│ ├── login.blade.php
│ └── register.blade.php
└── user/
├── login.blade.php
└── register.blade.php
auth/user/login.blade.php<form method="POST" action="/login">
@csrf
<input type="email" name="email" placeholder="Email">
<input type="password" name="password" placeholder="Password">
<button>Login</button>
</form>
auth/admin/login.blade.php<form method="POST" action="/admin/login">
@csrf
<input type="email" name="email" placeholder="Admin Email">
<input type="password" name="password" placeholder="Password">
<button>Admin Login</button>
</form>
Different forms. Different routes. Same logic.
Create middleware:
php artisan make:middleware AdminOnly
public function handle($request, Closure $next)
{
if (!auth()->check() || !auth()->user()->isAdmin()) {
abort(403);
}
return $next($request);
}
Register it in bootstrap/app.php:
$middleware->alias([
'admin' => \App\Http\Middleware\AdminOnly::class,
]);
Use it:
Route::middleware(['auth', 'admin'])->group(function () {
Route::get('/admin/dashboard', fn () => 'Admin Dashboard');
});
/admin)This structure scales well and doesn’t confuse future you.
Not unless you really need it. One table with roles is simpler and safer for beginners.
They shouldn’t. Separate login pages reduce security mistakes.
Yes. Just extend the role column (editor, manager, etc.) and reuse middleware.
No comments yet. Be the first to comment!
Please log in to post a comment:
Sign in with Google
Kritim Yantra