Tambah Auth Fetures

This commit is contained in:
2026-02-20 00:41:09 +08:00
parent 6ab40e6d65
commit 0d6d28e4ea
14 changed files with 3898 additions and 9 deletions

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redis;
class AuthController extends Controller
{
public function showLogin()
{
if (Auth::check()) {
return redirect('/dashboard');
}
return view('auth.login');
}
public function login(Request $request)
{
$request->validate([
'login' => 'required',
'password' => 'required'
]);
$loginType = filter_var($request->login, FILTER_VALIDATE_EMAIL) ? 'email' : 'employee_id';
$credentials = [
$loginType => $request->login,
'password' => $request->password
];
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
session(['token_version' => Auth::user()->token_version]);
Redis::lpush('login_logs', json_encode([
'user_id' => Auth::id(),
'event' => 'login',
'ip' => request()->ip(),
'time' => now()
]));
return redirect('/dashboard');
}
return back()->withErrors([
'login' => 'ID Pekerja / Email atau Password salah.'
]);
}
public function logout(Request $request)
{
$userId = Auth::id(); // ambil dulu sebelum logout
Redis::lpush('login_logs', json_encode([
'user_id' => $userId,
'event' => 'logout',
'ip' => request()->ip(),
'time' => now()
]));
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login');
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
class CheckTokenVersion
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (Auth::check()) {
if (session('token_version') != Auth::user()->token_version) {
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/login')->with('message', 'Session expired. Please login again.');
}
}
return $next($request);
}
}

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
class IdleTimeout
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (Auth::check()) {
$timeout = 1800; // 15 minit (900 saat)
if (session()->has('last_activity')) {
if (time() - session('last_activity') > $timeout) {
Auth::logout();
session()->invalidate();
return redirect('/login')->with('message', 'Session expired.');
}
}
session(['last_activity' => time()]);
}
return $next($request);
}
}

View File

@@ -19,6 +19,7 @@ class User extends Authenticatable
*/
protected $fillable = [
'name',
'employee_id',
'email',
'password',
];