1. Go to this page and download the library: Download delickate/user-sessions library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use App\Http\Controllers\UserController;
use App\Http\Controllers\UserSessions\UserSessionController;
use App\Http\Controllers\ChangePasswordController;
use App\Http\Controllers\HomeController;
//SANI: change password
Route::middleware(['auth'])->group(function ()
{
//SANI: user sessions
Route::get('/sessions', [UserSessionController::class, 'index'])
->name('sessions');
Route::get('/user-sessions/{session_id}/activities',
[UserSessionController::class, 'activities']
)->name('user-sessions.activities');
Route::get('/user-sessions/{session_id}/audit-logs',
[UserSessionController::class, 'auditLogs']
)->name('user-sessions.audit-logs');
//SANI: Change password & their rules
Route::get('/change-password', [ChangePasswordController::class, 'show'])
->name('password.change.form');
Route::post('/change-password', [ChangePasswordController::class, 'update'])
->name('password.change.update');
//SANI: Forcefully change password
Route::middleware(['force.password.change'])->group(function ()
{
Route::get('/home', [HomeController::class, 'index']);
});
//SANI: Exception logs
Route::get('/test-exception', function ()
{
throw new Exception("Test Exception Logging");
});
});
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
'password_changed_at' //SANI: user-sessions
];
use App\Models\ExceptionLog;
use Throwable;
public function register()
{
$this->reportable(function (Throwable $e) {
try {
ExceptionLog::create([
'message' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'trace' => $e->getTraceAsString(),
'url' => request()->fullUrl() ?? null,
'method' => request()->method() ?? null,
'ip' => request()->ip() ?? null,
'user_id' => auth()->check() ? auth()->id() : null,
]);
} catch (\Exception $ex) {
// Prevent infinite loop if DB logging fails
}
});
}
//SANI: show 500 error on exception
public function render($request, Throwable $e)
{
if (app()->environment('production'))
{
return response()->view('errors.500', [], 500);
}
return parent::render($request, $e);
}