Laravel Custom Table Login with Custom Validation Rules with Custom Message
--
- Loin Table: students
2. Login Blade with code:
<form action="{{ route('student.student_login') }}" method="POST" class="needs-validation" novalidate>
@csrf
<div class="mb-3">
<label for="username" class="form-label">Email</label>
<input name="email" type="text" class="form-control" id="username"
placeholder="Enter username">
@error('email') <span class="text-danger"><i class="entypo-info-circled"></i> {{ $message }}</span> @enderror
</div>
<div class="mb-3">
<div class="float-end">
<a href="{{route('student.password-reset-email')}}" class="text-muted">Forgot password?</a>
</div>
<label class="form-label">Password</label>
<div class="input-group auth-pass-inputgroup">
<input id="password-input" name="password" type="password" class="form-control" placeholder="Enter password" aria-label="Password" aria-describedby="password-addon">
<button onclick="showPassword()" class="btn btn-light " type="button" id="password-addon"><i class="mdi mdi-eye-outline"></i></button>
</div>
@error('password') <span class="text-danger"><i class="entypo-info-circled"></i> {{ $message }}</span> @enderror
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="remember-check">
<label class="form-check-label" for="remember-check">
Remember me
</label>
</div>
<div class="mt-3 d-grid">
<button class="btn btn-primary waves-effect waves-light"
type="submit">Log In</button>
</div>
</form>
3. Config : auth.php
Add new guards and providers like this for student
4. Controller: StudentLogInController
Set guard() and return student auth login blade for frontend.
Login method with custom rules:
Full Controller code bellow:
<?php
namespace App\Http\Controllers\Student\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\Student\StudentLoginRequest;
use App\Model\Student;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\StatefulGuard;
use Illuminate\Support\Facades\Validator;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
class StudentLoginController extends Controller
{
/**
* Student guard check
* @return Guard|StatefulGuard
*/
protected function guard()
{
return Auth::guard('student');
}
/**
* Return login view pages
* @return View
*/
public function loginView()
{
return view('student.auth.login');
}
/**
* Student login with custom validation
* @param StudentLoginRequest $request
* @return RedirectResponse
* @throws ValidationException
*/
public function studentLogin(StudentLoginRequest $request)
{
/**
* General email validation with exists check
*/
$this->validate($request, [
'email' => 'required|email|exists:students,email',
'password' => 'required',
]);
/**
* Custom validation rules, message return and validate
*/
$rules = [
'email' => [
Rule::exists('students', 'email')->where(function ($query) {
return $query->where('status', '!=', 'un_verified')->where('email_verified_at', '!=', '');
}),
],
];
$messages = ['email.exists' => 'Your account is not activated yet. Please verify email or contact with authority.'];
$email = Validator::make($request->all(), $rules, $messages);
if ($email->fails()) {
return redirect()->route('student.student_login')->withErrors($email)->withInput();
}
/**
* Login attempt
*/
$student = Student::where('email', $request['email'])->first();
if($this->guard()->attempt(array('email' => $request['email'], 'password' => $request['password']))) {
$student->update([
'last_login' => now()->format('F j, Y, g:i a'),
]);
return redirect()->route('student.dashboard');
}else {
return redirect()->route('student.student_login')->withErrors(array('password' => 'Invalid password, please try again later.'))->withInput();
}
}
/**
* Logout function for student.
* @param Request $request
* @return RedirectResponse
*/
public function logout(Request $request)
{
Auth::guard('student')->logout();
$request->session()->invalidate();
return redirect()->route('student.student_login');
}
}
Just paste to your code and test by yourself.
Additional Instruction
Set a middleware for student table users.
In App\Http\Karnel
App\Http\Middleware\StudentAuth with code
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class StudentAuth
{
/**
* Handle an incoming request.
*
* @param Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return RedirectResponse
*/
public function handle($request, Closure $next)
{
if (!Auth::guard('student')->check()) {
return redirect('/student/login');
}
return $next($request);
}
}
Now you can use this middleware in controller and route like this, you can also separate route from user also.
Follow those code and you will definitly found a good result.
— Shah Md. Iktakhirul Islam, Software Engineer.
Contact Number: 01683201359
Email: iktakhairul@gmail.com
GitHub Profile: https://github.com/iktakhairul