Kotchasan Framework Documentation
Login Class - ระบบล็อกอิน
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/password2. 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