Compare commits

...

4 Commits

Author SHA1 Message Date
putrakuningan
a1104e0c5a Change Authentication Background 2025-09-03 08:48:42 +07:00
Sholahuddin Al Ayubi
75701b53a9 Adds custom validation messages and improves error feedback
Introduces custom validation messages for login and password fields to enhance clarity for users. Updates error feedback text to provide more specific guidance when authentication fails. Fixes formatting issue in the password error message in the view for consistency.
2025-08-12 13:36:28 +07:00
Daeng Deni Mardaeni
0b377847cf feat(authentication): penyesuaian tampilan dan logika otentikasi pengguna
- Menambahkan `use Exception` pada kelas `Uim` untuk penanganan error yang lebih eksplisit.
- Menghapus penggunaan class `Request` yang tidak digunakan dalam `LoginRequest`.
- Memperbaiki logika penyesuaian role berdasarkan `KD_GROUP`, menetapkan `default` sebagai `customer_service` untuk menghindari kondisi default role tidak ditangani.
- Membuat beberapa perbaikan format dan konsistensi kelas serta elemen HTML di file blade:
  - Menyesuaikan atribut HTML untuk memastikan konsistensi seperti spasi, indentasi, dan tata letak elemen.
  - Memutakhirkan logo dan elemen visual untuk mendukung dinamika seperti nama aplikasi (`APP_NAME`) dan metode otentikasi (`METHOD_AUTH`) yang dapat dikonfigurasi melalui environment file.
  - Mengubah elemen teks dan gaya agar lebih responsif dan ramah pengguna.
- Meningkatkan pengalaman pengguna dengan memperbaiki hierarki elemen di form login dan halaman utama.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-07-08 14:54:36 +07:00
Daeng Deni Mardaeni
cf5a7824c5 feat(authentication): perbaikan proses login dan penyesuaian role pengguna
- Memperbaiki proses login dengan menggunakan filter untuk email atau NIK sebagai parameter login.
- Menggunakan `updateOrCreate` untuk membuat atau memperbarui data user berdasarkan parameter login.
- Menambahkan logika untuk mendapatkan cabang berdasarkan 4 digit terakhir kode cabang (`KD_CABANG`) dan mengaitkannya dalam sesi serta data pengguna.
- Menerapkan penyesuaian role pengguna menggunakan kode grup pengguna (`KD_GROUP`) dengan logika `match`.
- Mengubah logika role menjadi lebih dinamis, memastikan pengguna mendapatkan role yang sesuai atau role default (`user`).
- Memastikan proses `session regenerate` terjadi setelah login.

Signed-off-by: Daeng Deni Mardaeni <ddeni05@gmail.com>
2025-06-22 16:59:57 +07:00
3 changed files with 68 additions and 57 deletions

View File

@@ -1,7 +1,8 @@
<?php
namespace Modules\Authentication\Classes;
use Exception;
class Uim
{
private string $serviceHost;

View File

@@ -4,7 +4,6 @@
use Illuminate\Auth\Events\Lockout;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Str;
@@ -28,6 +27,14 @@
];
}
public function messages()
{
return [
'login.required' => 'User tidak boleh kosong',
'password.required' => 'Password tidak boleh kosong',
];
}
/**
* Attempt to authenticate the request's credentials.
*
@@ -51,7 +58,7 @@
if (!Auth::attempt($authData, $this->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'login' => trans('auth.failed'),
'login' => 'Email/NIK atau password tidak sesuai.'
]);
}
@@ -84,39 +91,34 @@
[$key, $val] = explode('=', $rval);
$userArray[0][$key] = $val;
}
session()->put($userArray[0]);
// Use the login value to find the user
$loginField = filter_var($credentials['login'], FILTER_VALIDATE_EMAIL) ? 'email' : 'nik';
$user = User::where($loginField, $credentials['login'])->first();
$someValue = $userArray[0]['KD_CABANG']; // Example value containing the code
$lastFourDigits = substr($someValue, -4); // Gets the last 4 characters
$kodeCabang = $userArray[0]['KD_CABANG']; // Example value containing the code
$lastFourDigits = substr($kodeCabang, -4); // Gets the last 4 characters
$branch = Branch::where('code', 'LIKE', '%' . $lastFourDigits)->first();
session()->put($userArray[0]);
session()->put('branch_id',$branch->id);
if (!$user) {
//get branch id by 4 digit terakhir 0029
$user = User::create([
$user = User::updateOrCreate(
[$loginField => $credentials['login']],
[
'name' => $userArray[0]['NAMA_USER'],
'email' => $loginField === 'email' ? $credentials['login'] : null,
'nik' => $loginField === 'nik' ? $credentials['login'] : null,
'password' => bcrypt($credentials['password']),
'branch_id' => $branch ? $branch->id : null,
]);
]
);
switch ($userArray[0]['KD_GROUP']) {
case '001':
$user->assignRole('administrator');
break;
case '025':
$user->assignRole('customer_service');
break;
}
}
// Assign role based on user group code
$role = match($userArray[0]['KD_GROUP']) {
'001' => 'administrator',
default => 'customer_service'
};
$user->syncRoles($role);
Auth::loginUsingId($user->id, true);
$this->session()->regenerate();
@@ -127,7 +129,7 @@
// Authentication failed
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'login' => trans('auth.failed'),
'login' => 'Email/NIK atau password tidak sesuai.',
]);
}

View File

@@ -3,81 +3,89 @@
@push('styles')
<style>
.branded-bg {
background-image:url('assets/media/images/2600x1600/1.png');
background-image: url('assets/media/images/2600x1600/bg-3.png');
}
.dark .branded-bg {
background-image: url('assets/media/images/2600x1600/1-dark.png');
background-image: url('assets/media/images/2600x1600/bg-3-dark.png');
}
</style>
@endpush
@section('content')
<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">
<div class="flex order-2 justify-center items-center p-8 lg:p-10 lg:order-1">
<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">
<form action="{{ route('login') }}" class="flex flex-col gap-5 p-10 card-body" 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">
<div class="mb-2.5 text-center">
<h3 class="mb-2.5 text-lg font-semibold leading-none text-gray-900">
Sign in
</h3>
</div>
<div class="flex flex-col gap-1">
<label class="form-label text-gray-900">
<label class="text-gray-900 form-label">
Email or NIK
</label>
<input class="w-full input @error('login') border-danger @enderror" placeholder="Enter your email or NIK" type="text" name="login" value="{{ old('login') }}">
<input class="w-full input @error('login') border-danger @enderror"
placeholder="Enter your email or NIK" type="text" name="login" value="{{ old('login') }}">
@error('login')
<em class="alert text-danger text-sm">{{ $message }}</em>
<em class="text-sm alert text-danger">{{ $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">
<div class="flex gap-1 justify-between items-center">
<label class="text-gray-900 form-label">
Password
</label>
</div>
<label class="input" data-toggle-password="true">
<input class="@error('password') border-danger @enderror" name="password" placeholder="Enter Password" type="password" value=""/>
<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>
<i class="hidden ki-outline ki-eye-slash toggle-password-active:block"></i>
</div>
@error('password')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</label>
@error('password')
<em class="text-sm alert text-danger">{{ $message }}</em>
@enderror
</div>
<label class="checkbox-group">
<input class="checkbox checkbox-sm" name="check" type="checkbox" value="1"/>
<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">
<button type="submit" class="flex justify-center btn btn-primary 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="order-1 bg-top bg-no-repeat lg:rounded-xl lg:border lg:border-gray-200 lg:m-5 lg:order-2 xxl:bg-center xl:bg-cover branded-bg">
<div class="flex flex-col gap-4 p-8 w-full lg:p-16">
<div class="flex w-full">
<img class="h-[100px] lg:h-[200px] max-w-none" src="assets/media/app/logo-agi.png" />
</div>
<div class="flex flex-col gap-3">
<h3 class="text-2xl font-semibold text-gray-900">
Secure Access Portal
<h3 class="text-4xl font-semibold text-gray-900">
{{ env('APP_NAME', 'Dashboard') }}
</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
<div class="text-lg font-medium text-gray-600">
A robust authentication
@if (env('METHOD_AUTH') == 'uim')
integrate with <span class="font-semibold text-gray-900">User ID
Management</span>
@endif
gateway ensuring
<br />
secure efficient user access to the
<span class="font-semibold text-gray-900">
{{ env('APP_NAME', 'Dashboard') }}
</span>
to the LPJ Online
<br/>
<br />
Dashboard interface.
</div>
</div>