Add Login and Logout function
This commit is contained in:
parent
4fafb66a43
commit
ea01665131
@ -6,6 +6,8 @@ use App\Http\Controllers\Controller;
|
|||||||
use Illuminate\Http\RedirectResponse;
|
use Illuminate\Http\RedirectResponse;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Http\Response;
|
use Illuminate\Http\Response;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Modules\Authentication\Http\Requests\LoginRequest;
|
||||||
|
|
||||||
class AuthenticationController extends Controller
|
class AuthenticationController extends Controller
|
||||||
{
|
{
|
||||||
@ -22,15 +24,19 @@ class AuthenticationController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function create()
|
public function create()
|
||||||
{
|
{
|
||||||
return view('authentication::create');
|
return view('authentication::index');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store a newly created resource in storage.
|
* Store a newly created resource in storage.
|
||||||
*/
|
*/
|
||||||
public function store(Request $request): RedirectResponse
|
public function store(LoginRequest $request): RedirectResponse
|
||||||
{
|
{
|
||||||
//
|
$request->authenticate();
|
||||||
|
|
||||||
|
$request->session()->regenerate();
|
||||||
|
|
||||||
|
return redirect()->intended(('dashboard'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,8 +66,12 @@ class AuthenticationController extends Controller
|
|||||||
/**
|
/**
|
||||||
* Remove the specified resource from storage.
|
* Remove the specified resource from storage.
|
||||||
*/
|
*/
|
||||||
public function destroy($id)
|
public function destroy(Request $request): RedirectResponse
|
||||||
{
|
{
|
||||||
//
|
Auth::guard('web')->logout();
|
||||||
|
$request->session()->invalidate();
|
||||||
|
$request->session()->regenerateToken();
|
||||||
|
|
||||||
|
return redirect('/');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
87
app/Http/Requests/LoginRequest.php
Normal file
87
app/Http/Requests/LoginRequest.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Modules\Authentication\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Auth\Events\Lockout;
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
use Illuminate\Support\Facades\RateLimiter;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
|
class LoginRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Returns an array of validation rules for the login form.
|
||||||
|
*
|
||||||
|
* @return array The validation rules.
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
: array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'email' => 'required|email',
|
||||||
|
'password' => 'required'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to authenticate the request's credentials.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws \Illuminate\Validation\ValidationException
|
||||||
|
*/
|
||||||
|
public function authenticate()
|
||||||
|
: void
|
||||||
|
{
|
||||||
|
$this->ensureIsNotRateLimited();
|
||||||
|
|
||||||
|
if (!Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
|
||||||
|
RateLimiter::hit($this->throttleKey());
|
||||||
|
|
||||||
|
throw ValidationException::withMessages([
|
||||||
|
'email' => trans('auth.failed'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
RateLimiter::clear($this->throttleKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure the login request is not rate limited.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @throws \Illuminate\Validation\ValidationException
|
||||||
|
*/
|
||||||
|
public function ensureIsNotRateLimited()
|
||||||
|
: void
|
||||||
|
{
|
||||||
|
if (!RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event(new Lockout($this));
|
||||||
|
|
||||||
|
$seconds = RateLimiter::availableIn($this->throttleKey());
|
||||||
|
|
||||||
|
throw ValidationException::withMessages([
|
||||||
|
'email' => trans('auth.throttle', [
|
||||||
|
'seconds' => $seconds,
|
||||||
|
'minutes' => ceil($seconds / 60),
|
||||||
|
]),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the rate limiting throttle key for the request.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function throttleKey()
|
||||||
|
: string
|
||||||
|
{
|
||||||
|
return Str::transliterate(Str::lower($this->input('email')) . '|' . $this->ip());
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,107 @@
|
|||||||
@extends('authentication::layouts.master')
|
@extends('layouts.auth')
|
||||||
|
|
||||||
|
@push('styles')
|
||||||
|
<style>
|
||||||
|
.branded-bg {
|
||||||
|
background-image:url('assets/media/images/2600x1600/1.png');
|
||||||
|
}
|
||||||
|
.dark .branded-bg {
|
||||||
|
background-image: url('assets/media/images/2600x1600/1-dark.png');
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<h1>Hello World</h1>
|
<div class="grid lg:grid-cols-2 grow">
|
||||||
|
<div class="flex justify-center items-center p-8 lg:p-10 order-2 lg:order-1">
|
||||||
<p>Module: {!! config('authentication.name') !!}</p>
|
<div class="card max-w-[370px] w-full">
|
||||||
|
<form action="{{ route('login') }}" class="card-body flex flex-col gap-5 p-10" id="sign_in_form" method="POST">
|
||||||
|
@csrf
|
||||||
|
<div class="text-center mb-2.5">
|
||||||
|
<h3 class="text-lg font-semibold text-gray-900 leading-none mb-2.5">
|
||||||
|
Sign in
|
||||||
|
</h3>
|
||||||
|
<div class="flex items-center justify-center font-medium">
|
||||||
|
<span class="text-2sm text-gray-600 me-1.5">
|
||||||
|
Need an account?
|
||||||
|
</span>
|
||||||
|
<a class="text-2sm link" href="">
|
||||||
|
Sign up
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<span class="border-t border-gray-200 w-full">
|
||||||
|
</span>
|
||||||
|
<span class="text-2xs text-gray-500 font-medium uppercase">
|
||||||
|
Or
|
||||||
|
</span>
|
||||||
|
<span class="border-t border-gray-200 w-full">
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-1">
|
||||||
|
<label class="form-label text-gray-900">
|
||||||
|
Email
|
||||||
|
</label>
|
||||||
|
<input class="w-full input @error('email') border-danger @enderror" placeholder="email@email.com" type="email" name="email" value="">
|
||||||
|
@error('email')
|
||||||
|
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-1">
|
||||||
|
<div class="flex items-center justify-between gap-1">
|
||||||
|
<label class="form-label text-gray-900">
|
||||||
|
Password
|
||||||
|
</label>
|
||||||
|
<a class="text-2sm link shrink-0" href="">
|
||||||
|
Forgot Password?
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<label class="input" data-toggle-password="true">
|
||||||
|
<input class="@error('password') border-danger @enderror" name="password" placeholder="Enter Password" type="password" value=""/>
|
||||||
|
<div class="btn btn-icon" data-toggle-password-trigger="true">
|
||||||
|
<i class="ki-outline ki-eye toggle-password-active:hidden"></i>
|
||||||
|
<i class="ki-outline ki-eye-slash hidden toggle-password-active:block"></i>
|
||||||
|
</div>
|
||||||
|
@error('password')
|
||||||
|
<em class="alert text-danger text-sm">{{ $message }}</em>
|
||||||
|
@enderror
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<label class="checkbox-group">
|
||||||
|
<input class="checkbox checkbox-sm" name="check" type="checkbox" value="1"/>
|
||||||
|
<span class="checkbox-label">
|
||||||
|
Remember me
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<button type="submit" class="btn btn-primary flex justify-center grow">
|
||||||
|
Sign In
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="lg:rounded-xl lg:border lg:border-gray-200 lg:m-5 order-1 lg:order-2 bg-top xxl:bg-center xl:bg-cover bg-no-repeat branded-bg">
|
||||||
|
<div class="flex flex-col p-8 lg:p-16 gap-4">
|
||||||
|
<a href="{{ route('dashboard') }}">
|
||||||
|
<img class="h-[100px] max-w-none" src="assets/media/app/logo-agi.png"/>
|
||||||
|
</a>
|
||||||
|
<div class="flex flex-col gap-3">
|
||||||
|
<h3 class="text-2xl font-semibold text-gray-900">
|
||||||
|
Secure Access Portal
|
||||||
|
</h3>
|
||||||
|
<div class="text-base font-medium text-gray-600">
|
||||||
|
A robust authentication gateway ensuring
|
||||||
|
<br/>
|
||||||
|
secure
|
||||||
|
<span class="text-gray-900 font-semibold">
|
||||||
|
efficient user access
|
||||||
|
</span>
|
||||||
|
to the LPJ Online
|
||||||
|
<br/>
|
||||||
|
Dashboard interface.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
@ -14,6 +14,11 @@ use Modules\Authentication\Http\Controllers\AuthenticationController;
|
|||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Route::group([], function () {
|
Route::middleware('guest')->group(function () {
|
||||||
Route::resource('authentication', AuthenticationController::class)->names('authentication');
|
Route::get('login', [AuthenticationController::class, 'create'])->name('login');
|
||||||
|
Route::post('login', [AuthenticationController::class, 'store']);
|
||||||
|
});
|
||||||
|
|
||||||
|
Route::middleware('auth')->group(function () {
|
||||||
|
Route::get('logout', [AuthenticationController::class, 'destroy'])->name('logout');
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user