Add Login and Logout function

This commit is contained in:
Daeng Deni Mardaeni 2024-08-07 14:45:15 +07:00
parent 4fafb66a43
commit ea01665131
4 changed files with 214 additions and 12 deletions

View File

@ -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('/');
} }
} }

View 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());
}
}

View File

@ -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

View File

@ -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');
}); });