Kotchasan Framework Documentation

Kotchasan Framework Documentation

Login Class - ระบบล็อกอิน

TH 03 Feb 2026 16:26

Login Class - ระบบล็อกอิน

คลาส Login เป็นคลาสสำหรับจัดการระบบล็อกอิน รวมถึงการตรวจสอบสิทธิ์ การจัดการ session และการตรวจสอบสิทธิ์การเข้าถึง

Namespace

Kotchasan\Login

ภาพรวม

คลาส Login ให้บริการ:

  • ล็อกอิน/ล็อกเอาท์ผู้ใช้งาน
  • จัดการ session
  • ตรวจสอบสิทธิ์การเข้าถึง (permissions)
  • ตรวจสอบ role (admin, member, super admin)
  • ตรวจสอบ status
  • รองรับการกู้คืนรหัสผ่าน

Public Properties

public static $from_submit    // บอกว่ามีการ submit form หรือไม่
public static $login_input     // input ที่ต้อง focus ('username' / 'password')
public static $login_message   // ข้อความแจ้งเตือน
public static $login_params    // ข้อมูลล็อกอินที่ส่งมา

Public Methods (11 methods)

create()

สร้าง instance และจัดการ login process

public static function create(Request $request): static

พารามิเตอร์:

  • $request - HTTP request object

คืนค่า: Login instance

ตัวอย่าง:

use Kotchasan\Login;
use Kotchasan\Http\Request;

$request = new Request();
$login = Login::create($request);

logout()

ล็อกเอาท์ผู้ใช้งาน (ลบ session)

public function logout(Request $request): void

ตัวอย่าง:

$login = Login::create($request);
$login->logout($request);
// ผู้ใช้ถูกล็อกเอาท์

forgot()

เริ่มกระบวนการกู้คืนรหัสผ่าน

public function forgot(Request $request): void

หมายเหตุ: Method นี้เป็น stub ต้อง implement เอง

ตัวอย่าง:

// ต้อง override ใน subclass
class MyLogin extends Login
{
    public function forgot(Request $request)
    {
        $email = $request->post('email')->toString();
        // ส่งอีเมลรีเซ็ตรหัสผ่าน
    }
}

login()

ทำการล็อกอิน

public function login(Request $request, array $loginParams): void

พารามิเตอร์:

  • $request - HTTP request
  • $loginParams - ข้อมูลล็อกอิน ['username' => '', 'password' => '']

ตัวอย่าง:

$login->login($request, [
    'username' => 'admin',
    'password' => '1234'
]);

checkLogin()

ตรวจสอบ username/password (ควร override)

public function checkLogin(array $loginParams): string|array

พารามิเตอร์:

  • $loginParams - ['username' => '', 'password' => '']

คืนค่า:

  • string - error message ถ้าล็อกอินไม่สำเร็จ
  • array - ข้อมูลผู้ใช้ ถ้าล็อกอินสำเร็จ

ตัวอย่าง:

class MyLogin extends Login
{
    public function checkLogin($loginParams)
    {
        $user = \Kotchasan\Model::create()
            ->from('user')
            ->where(['username', $loginParams['username']])
            ->first();

        if (!$user) {
            return 'User not found';
        }

        if (!password_verify($loginParams['password'], $user->password)) {
            return 'Incorrect password';
        }

        return (object)[
            'id' => $user->id,
            'username' => $user->username,
            'status' => $user->status,
            'permission' => json_decode($user->permission, true)
        ];
    }
}

hasPermission()

ตรวจสอบสิทธิ์การเข้าถึง

public static function hasPermission(
    string|array $permission,
    ?object $login = null,
    bool $checkAdmin = true
): ?object

พารามิเตอร์:

  • $permission - สิทธิ์ที่ต้องการตรวจสอบ
  • $login - ข้อมูลล็อกอิน (ถ้าไม่ระบุจะใช้ isMember())
  • $checkAdmin - ถ้า true, admin มีสิทธิ์ทุกอย่าง

คืนค่า: login object ถ้ามีสิทธิ์, null ถ้าไม่มี

ตัวอย่าง:

$login = Login::isMember();

// ตรวจสอบสิทธิ์เดียว
if (Login::hasPermission('can_edit', $login)) {
    // มีสิทธิ์แก้ไข
}

// ตรวจสอบหลายสิทธิ์ (มีอย่างใดอย่างหนึ่งก็ผ่าน)
if (Login::hasPermission(['can_edit', 'can_delete'], $login)) {
    // มีสิทธิ์อย่างใดอย่างหนึ่ง
}

isSuperAdmin()

ตรวจสอบว่าเป็น super admin (id === 1)

public static function isSuperAdmin(?object $login = null): ?object

คืนค่า: login object ถ้าเป็น super admin, null ถ้าไม่ใช่

ตัวอย่าง:

if ($user = Login::isSuperAdmin()) {
    // เป็น super admin (id = 1)
    echo "Super Admin: " . $user->username;
}

isAdmin()

ตรวจสอบว่าเป็น admin (status === 1)

public static function isAdmin(?object $login = null): ?object

คืนค่า: login object ถ้าเป็น admin, null ถ้าไม่ใช่

ตัวอย่าง:

if ($user = Login::isAdmin()) {
    // เป็น admin
    echo "Admin: " . $user->username;
}

isMember()

ตรวจสอบว่ามีการล็อกอินหรือไม่

public static function isMember(): ?object

คืนค่า: login object ถ้าล็อกอินแล้ว, null ถ้ายังไม่ล็อกอิน

ตัวอย่าง:

if ($user = Login::isMember()) {
    echo "Logged in as: " . $user->username;
} else {
    // ยังไม่ได้ล็อกอิน - redirect ไปหน้า login
    header('Location: /login');
}

checkStatus()

ตรวจสอบ status ของผู้ใช้

public static function checkStatus(
    object $login,
    mixed $statuses
): ?object

พารามิเตอร์:

  • $login - ข้อมูลล็อกอิน
  • $statuses - status ที่อนุญาต (int หรือ array)

คืนค่า: login object ถ้า status ตรงกัน, null ถ้าไม่ตรง

ตัวอย่าง:

$login = Login::isMember();

// ตรวจสอบ single status
if (Login::checkStatus($login, 2)) {
    // status = 2 (เช่น active member)
}

// ตรวจสอบหลาย status
if (Login::checkStatus($login, [2, 3])) {
    // status = 2 หรือ 3
}

sessionKey()

ดึง session key สำหรับเก็บข้อมูล login

public static function sessionKey(): string

คืนค่า: session key (อ่านจาก config หรือใช้ 'login' เป็น default)

ตัวอย่าง:

$key = Login::sessionKey();  // 'login' หรือค่าจาก config
$userData = $_SESSION[$key];

ตัวอย่างการใช้งานแบบสมบูรณ์

1. Basic Login System

use Kotchasan\Login;
use Kotchasan\Http\Request;

class AuthController
{
    public function showLoginPage()
    {
        $request = new Request();
        $login = Login::create($request);

        // ดึงข้อมูลสำหรับแสดงในหน้า login
        $data = [
            'message' => Login::$login_message,
            'username' => Login::$login_params['username'] ?? '',
            'focus' => Login::$login_input
        ];

        // ตรวจสอบว่าล็อกอินแล้วหรือยัง
        if ($user = Login::isMember()) {
            // ล็อกอินสำเร็จ - redirect ไปหน้าหลัก
            header('Location: /dashboard');
            exit;
        }

        // แสดงหน้า login
        return view('login', $data);
    }
}

2. Custom Login with Database

use Kotchasan\Login;
use Kotchasan\Model;

class AppLogin extends Login
{
    public function checkLogin($loginParams)
    {
        $username = $loginParams['username'] ?? '';
        $password = $loginParams['password'] ?? '';

        // ค้นหาผู้ใช้ในฐานข้อมูล
        $user = Model::create()
            ->from('users')
            ->where(['username', $username])
            ->first();

        if (!$user) {
            self::$login_input = 'username';
            return 'Username not found';
        }

        if ($user->status == 0) {
            return 'Account is inactive';
        }

        // ตรวจสอบรหัสผ่าน
        if (!password_verify($password, $user->password)) {
            self::$login_input = 'password';
            return 'Incorrect password';
        }

        // อัปเดต last login
        Model::create()
            ->update('users')
            ->set(['last_login' => time()])
            ->where(['id', $user->id])
            ->execute();

        // คืนค่าข้อมูลผู้ใช้
        return (object)[
            'id' => $user->id,
            'username' => $user->username,
            'name' => $user->name,
            'email' => $user->email,
            'status' => $user->status,
            'permission' => json_decode($user->permission, true) ?? []
        ];
    }
}

3. Permission-Based Access Control

use Kotchasan\Login;

class ArticleController
{
    public function edit($id)
    {
        $login = Login::isMember();

        if (!$login) {
            // ยังไม่ล็อกอิน
            return redirect('/login');
        }

        // ตรวจสอบสิทธิ์แก้ไข
        if (!Login::hasPermission('can_edit_article', $login)) {
            return error('You don\'t have permission to edit articles');
        }

        // มีสิทธิ์ - ดำเนินการต่อ
        $article = $this->getArticle($id);
        return view('article/edit', ['article' => $article]);
    }

    public function delete($id)
    {
        $login = Login::isMember();

        // ตรวจสอบว่าเป็น admin หรือมีสิทธิ์ลบ
        if (!Login::isAdmin($login) &&
            !Login::hasPermission('can_delete_article', $login, false)) {
            return error('Permission denied');
        }

        // ลบ article
        $this->deleteArticle($id);
        return success('Article deleted');
    }
}

4. Role-Based Dashboard

use Kotchasan\Login;

class DashboardController
{
    public function index()
    {
        $login = Login::isMember();

        if (!$login) {
            return redirect('/login');
        }

        // Super Admin Dashboard
        if (Login::isSuperAdmin($login)) {
            return $this->superAdminDashboard($login);
        }

        // Admin Dashboard
        if (Login::isAdmin($login)) {
            return $this->adminDashboard($login);
        }

        // Member Dashboard
        return $this->memberDashboard($login);
    }

    private function superAdminDashboard($login)
    {
        // เฉพาะ super admin (id = 1)
        return view('dashboard/super', [
            'users' => $this->getAllUsers(),
            'settings' => $this->getSystemSettings()
        ]);
    }

    private function adminDashboard($login)
    {
        // Admin (status = 1)
        return view('dashboard/admin', [
            'stats' => $this->getStatistics(),
            'recent' => $this->getRecentActivities()
        ]);
    }

    private function memberDashboard($login)
    {
        // Member ทั่วไป
        return view('dashboard/member', [
            'profile' => $login,
            'tasks' => $this->getUserTasks($login->id)
        ]);
    }
}

5. Status-Based Content Access

use Kotchasan\Login;

class ContentController
{
    public function show($id)
    {
        $login = Login::isMember();
        $content = $this->getContent($id);

        // เนื้อหาสาธารณะ
        if ($content->is_public) {
            return $this->renderContent($content);
        }

        // ต้องล็อกอิน
        if (!$login) {
            return redirect('/login');
        }

        // ตรวจสอบ status ที่อนุญาต
        if (!Login::checkStatus($login, [1, 2, 3])) {
            return error('Your account status does not allow access to this content');
        }

        // แสดงเนื้อหา
        return $this->renderContent($content);
    }
}

6. Password Recovery

use Kotchasan\Login;
use Kotchasan\Email;
use Kotchasan\Model;

class AppLogin extends Login
{
    public function forgot(Request $request)
    {
        $email = $request->post('email')->toString();

        // ค้นหาผู้ใช้
        $user = Model::create()
            ->from('users')
            ->where(['email', $email])
            ->first();

        if (!$user) {
            self::$login_message = 'Email not found';
            return;
        }

        // สร้าง reset token
        $token = bin2hex(random_bytes(32));
        $expire = time() + 3600; // 1 ชั่วโมง

        // บันทึก token
        Model::create()
            ->update('users')
            ->set([
                'reset_token' => $token,
                'reset_expire' => $expire
            ])
            ->where(['id', $user->id])
            ->execute();

        // ส่งอีเมล
        $resetLink = "https://example.com/reset?token=$token";
        Email::send($email, 'Password Reset',
            "Click to reset: $resetLink");

        self::$login_message = 'Reset link sent to your email';
    }
}

7. Middleware for Route Protection

use Kotchasan\Login;

class AuthMiddleware
{
    public static function requireLogin()
    {
        if (!Login::isMember()) {
            header('Location: /login');
            exit;
        }
    }

    public static function requireAdmin()
    {
        $login = Login::isMember();

        if (!Login::isAdmin($login)) {
            http_response_code(403);
            die('Access forbidden');
        }
    }

    public static function requirePermission($permission)
    {
        $login = Login::isMember();

        if (!Login::hasPermission($permission, $login)) {
            http_response_code(403);
            die('Permission denied');
        }
    }
}

// ใช้งาน
AuthMiddleware::requireLogin();
AuthMiddleware::requireAdmin();
AuthMiddleware::requirePermission('can_manage_users');

Best Practices

1. Custom Implementation

// ✅ ควร extend และ override checkLogin
class MyLogin extends Login
{
    public function checkLogin($loginParams)
    {
        // ตรวจสอบจากฐานข้อมูลจริง
    }
}

// ❌ อย่าใช้ default implementation ใน production
$login = Login::create($request);  // ใช้ config username/password

2. Session Management

// ✅ ใช้ sessionKey() เพื่อความยืดหยุ่น
$key = Login::sessionKey();
$userData = $_SESSION[$key];

// ❌ อย่า hardcode session key
$userData = $_SESSION['login'];  // จะไม่ทำงานถ้า config เปลี่ยน

3. Permission Checks

// ✅ ตรวจสอบสิทธิ์ก่อนทำงาน
if (Login::hasPermission('can_delete', $login)) {
    $this->deleteItem($id);
}

// ❌ อย่าสมมติว่ามีสิทธิ์
$this->deleteItem($id);  // ไม่ปลอดภัย!

4. Error Messages

// ✅ ใช้ Login::$login_message และ Login::$login_input
if (Login::$login_message) {
    echo "<div class='error'>" . Login::$login_message . "</div>";
}
if (Login::$login_input) {
    echo "<script>document.getElementById('" . Login::$login_input . "').focus();</script>";
}

สรุป

คลาส Login เป็นระบบจัดการ authentication ที่:

  • ✅ จัดการ login/logout
  • ✅ ตรวจสอบสิทธิ์ (permissions)
  • ✅ รองรับ role-based access (super admin, admin, member)
  • ✅ ตรวจสอบ status
  • 🔒 ต้อง extend สำหรับ production
  • 📝 รองรับ password recovery

เหมาะสำหรับ:

  • ระบบสมาชิก
  • Admin panel
  • CMS
  • Web applications
  • API authentication (ร่วมกับ session)

ไฟล์ขนาด: 304 บรรทัด
Public Methods: 11 methods
Pattern: Extends KBase