Skip to content

Authentication Configuration

  • File: src/pages/private/admin/authConfig/index.svelte

Overview

The Authentication Configuration page allows administrators to manage security rules and password policies for the system. It provides a comprehensive interface for configuring brute force detection, password requirements, and account security settings.

Data Structures

Security Policy Interface

ts
interface SecurityPolicy {
  // Brute Force Settings
  enableBruteForce: boolean;
  permanentLockout: boolean;
  maxLoginFailures: number;
  waitIncrement: number;
  waitIncrementStatus: string;
  quickLoginCheck: number;
  quickLoginCheckStatus: string;
  minimumQuickLogin: number;
  minimumQuickLoginStatus: string;
  maxWait: number;
  maxWaitStatus: string;
  failureResetTime: number;
  failureResetTimeStatus: string;

  // Password Policy Settings
  minLength: number;
  daysExpiry: number;
  inactiveDays: number;
  specialCharacters: number;
  upperCase: number;
  lowerCase: number;
}

Core Functions

1. Time Conversion Utilities

svelte
// Convert seconds to human-readable format
function convertFromSeconds(valueInSeconds) {
  if (valueInSeconds % 3600 === 0) {
    return {
      convertedValue: valueInSeconds / 3600,
      type: "Hours"
    };
  }
  if (valueInSeconds % 60 === 0) {
    return {
      convertedValue: valueInSeconds / 60,
      type: "Minutes"
    };
  }
  return {
    convertedValue: valueInSeconds,
    type: "Seconds"
  };
}

// Convert human-readable format to seconds
function convertToSeconds(value, type) {
  switch (type) {
    case "Minutes":
      return value * 60;
    case "Hours":
      return value * 3600;
    case "Seconds":
    default:
      return value;
  }
}

2. API Operations

svelte
// Save authentication configuration
async function saveAuthConfig(command) {
  const query = `
    mutation SendData ($input: UpdateTenantSecurityRulesCommandInput!) {
      updateTenantSecurityRules(command: $input) {
        success, message, code
      }
    }
  `;

  const { data, error } = await mutation<any>(query, { input: command });
  if (error) {
    showError(error.message);
  }
  return data;
}

// Read current configuration
async function readValues() {
  const { data, error } = await query<any>(`
    query {
      tenantSecurityRules {
        success, message, data {
          daysExpiry, enableBruteForce, failureResetTime,
          inactiveDays, lowerCase, maxLoginFailures,
          maxWait, minimumQuickLogin, minLength,
          permanentLockout, quickLoginCheck,
          specialCharacters, upperCase, waitIncrement
        }
      }
    }
  `);

  if (error) {
    return { success: false, message: error?.message || error };
  }
  return data.tenantSecurityRules;
}

Event Handlers

1. Save Operation

svelte
async function onSave() {
  const data = {
    waitIncrement: policy?.waitIncrement
      ? convertToSeconds(policy.waitIncrement, policy.waitIncrementStatus)
      : 0,
    maxWait: policy?.maxWait
      ? convertToSeconds(policy.maxWait, policy.maxWaitStatus)
      : 0,
    failureResetTime: policy?.failureResetTime
      ? convertToSeconds(policy.failureResetTime, policy.failureResetTimeStatus)
      : 0,
    enableBruteForce: policy.enableBruteForce,
    permanentLockout: policy.permanentLockout,
    maxLoginFailures: policy.maxLoginFailures,
    quickLoginCheck: convertToSeconds(
      policy.quickLoginCheck,
      policy.quickLoginCheckStatus
    ),
    minimumQuickLogin: convertToSeconds(
      policy.minimumQuickLogin,
      policy.minimumQuickLoginStatus
    ),
    minLength: policy.minLength,
    daysExpiry: policy.daysExpiry,
    inactiveDays: policy.inactiveDays,
    specialCharacters: policy.specialCharacters,
    upperCase: policy.upperCase,
    lowerCase: policy.lowerCase,
  };

  await toast.promise(saveAuthConfig(data), {
    loading: "Loading...",
    success: (ret: any) => {
      if (!ret?.updateTenantSecurityRules?.success) {
        return ret.message || "Failed";
      }
      return ret?.updateTenantSecurityRules?.message || "Record added";
    },
    error: (error: any) => {
      const errorMessage = error?.message || error;
      return `Error: ${errorMessage}`;
    },
  });
}

UI Implementation

svelte
<div class="">
  {#if busy}
    <Progress step={1} />
  {:else}
    <form class="space-y-8 sm:space-y-5" on:submit|preventDefault={onSave}>
      <!-- Brute Force Section -->
      <div class="space-y-5">
        <p class="font-semibold">Brute Force Detection</p>
        <!-- Brute Force Controls -->
      </div>

      <!-- Password Policy Section -->
      <div class="pt-4">
        <p class="font-semibold">Password Policy</p>
        <!-- Password Policy Controls -->
      </div>

      <!-- Save Button -->
      <div class="flex">
        <button
          class="mx-auto border p-2 w-32 bg-slate-100 hover:bg-slate-200"
          type="submit"
        >
          Save
        </button>
      </div>
    </form>
  {/if}
</div>

Released under the MIT License.