บทความ

ติดตั้ง Adminer ใน Laravel ยังไง ให้เข้าผ่าน login ของแอปด้วย laravel-adminer

laravel-adminer ย้าย Adminer มาอยู่ใต้ route ของแอป Laravel ใช้ login ของแอปกันคนนอก โพสต์นี้ไล่ตั้งแต่ติดตั้ง ตั้ง middleware ให้ถูก จำกัดเฉพาะบางคน autologin ธีม ปลั๊กอิน และเรื่องที่ README ไม่ได้บอก

เผยแพร่
เวลาอ่าน
5 นาที

Adminer คืออะไร

Adminer เป็นโปรแกรมจัดการฐานข้อมูลผ่านหน้าเว็บ ทำงานคล้าย phpMyAdmin แต่ทั้งโปรแกรมเป็นไฟล์ PHP ไฟล์เดียว ใช้ได้กับ MySQL, MariaDB, PostgreSQL, SQLite และ SQL Server เปิดดูตาราง แก้ข้อมูล รัน SQL export และ import ได้ครบ

วิธีที่หลายคนใช้กันคือโหลด adminer.php ไปวางไว้ใน public/ แล้วเปิดจากเบราว์เซอร์ ง่ายดี แต่ไฟล์นั้นเปิดจากอินเทอร์เน็ตได้ทุกคน กันได้ด้วยรหัสผ่านฐานข้อมูลอย่างเดียว และถ้าลืมลบหลังใช้เสร็จ ไฟล์ก็ค้างอยู่บนเซิร์ฟเวอร์ต่อไปเรื่อย ๆ

laravel-adminer ช่วยอะไร

laravel-adminer ครอบ Adminer ไว้ใน route ของ Laravel ผมเองก็เคยใช้ตัวนี้ ก่อนจะย้ายมาเขียนเครื่องมือของตัวเอง ได้ข้อดีเพิ่มมาสามข้อ

  • ต้อง login แอปก่อน คนที่ไม่มีบัญชีในแอปจะไม่เห็นแม้แต่หน้า login ของ Adminer
  • เปิดปิดด้วย .env ตั้ง ADMINER_ENABLED=false แล้ว /adminer จะตอบ 404 ไม่ต้องจำว่าวางไฟล์ไว้ตรงไหน
  • อัปเดตผ่าน Composer Adminer มากับแพ็กเกจ ไม่ต้องโหลดไฟล์ใหม่มาวางเอง

ตอนเขียนโพสต์นี้ เวอร์ชันล่าสุดคือ 8.0.3 (กุมภาพันธ์ 2026) รองรับ Laravel 5 ถึง 13 และมี Adminer 5.0.4 รวมมาด้วย

ติดตั้ง

composer require onecentlin/laravel-adminer
php artisan vendor:publish --provider="Onecentlin\Adminer\ServiceProvider"

คำสั่ง publish สร้างไฟล์สามอย่าง

  • config/adminer.php ไฟล์ตั้งค่า
  • public/adminer.css ธีมของ Adminer (ธีม Hever)
  • resources/adminer/plugins/ โฟลเดอร์ใส่ปลั๊กอิน

ตั้ง middleware ให้ถูก

ไฟล์ config ที่ได้มาตั้ง 'middleware' => 'auth' ไว้ ค่านี้ใช้ไม่ได้ เพราะ route ของ Adminer ไม่ได้อยู่ในกลุ่ม web จึงไม่มี session ต่อให้ login แอปไว้แล้ว เปิด /adminer ก็ยังโดนส่งกลับไปหน้า login อยู่ดี

ให้สร้าง middleware group ชื่อ adminer ใน bootstrap/app.php แล้วชี้ config ไปที่ group นี้

->withMiddleware(function (Middleware $middleware): void {
    $middleware->group('adminer', [
        \Illuminate\Cookie\Middleware\EncryptCookies::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\Auth\Middleware\Authenticate::class,
    ]);
})

group นี้ไม่มีตัวตรวจ CSRF ของ Laravel ซึ่งไม่เป็นไร เพราะฟอร์มของ Adminer มี token ของตัวเองอยู่แล้ว ถ้ายังไม่ได้ login แอป จะโดนส่งไปที่ route ชื่อ login ตามปกติ

ให้เข้าได้แค่บางคน

แพ็กเกจกันแค่คนที่ยังไม่ login ถ้าแอปมีผู้ใช้หลายคน เช่นพนักงานหน้าร้านหรือลูกค้า ทุกคนที่ login ได้จะเปิด /adminer ได้หมด ให้เพิ่ม Gate เข้าไปใน group

$middleware->group('adminer', [
    \Illuminate\Cookie\Middleware\EncryptCookies::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\Auth\Middleware\Authenticate::class,
    'can:viewAdminer',
]);

คนที่อยู่ในรายชื่อเข้าได้ตามปกติ คนอื่นที่ login แล้วจะได้ 403 ส่วนคนที่ยังไม่ login ก็ยังโดนส่งไปหน้า login เหมือนเดิม

เปิด /adminer

เปิด /adminer จะเจอหน้า login ของ Adminer เลือกชนิดฐานข้อมูล แล้วกรอก server, username, password และชื่อฐานข้อมูล ใช้ค่าเดียวกับ DB_HOST, DB_USERNAME, DB_PASSWORD และ DB_DATABASE ใน .env

หน้า login ของ Adminer ที่ /adminer

เข้าไปแล้วจะเห็นรายชื่อตารางทั้งหมด พร้อมขนาดและจำนวนแถวโดยประมาณ (เลขที่มี ~ นำหน้า)

หน้ารวมตารางในฐานข้อมูล

กด select ที่ชื่อตารางเพื่อดูข้อมูล ค้นหา เรียงลำดับ แก้ทีละแถว หรือเลือกหลายแถวแล้วลบ และ export ได้จากหน้านี้

ดูข้อมูลในตาราง orders

หน้า Show structure แสดงคอลัมน์ index และ foreign key ของตาราง

โครงสร้างตาราง orders พร้อม foreign key ไปที่ customers

ส่วน SQL command รัน SQL ได้ทุกแบบ รวมถึง JOIN หลายตาราง

รัน SQL แบบ JOIN ในหน้า SQL command

ไม่อยากกรอกรหัสทุกครั้ง ใช้ autologin

ADMINER_AUTO_LOGIN=true

เปิดแล้ว Adminer จะ login ให้เองด้วยค่าของ database connection หลักของแอป ข้ามหน้า login ไปที่ฐานข้อมูลของแอปเลย สะดวกมาก แต่มีเรื่องที่ต้องรู้

  • ใครเข้า /adminer ได้ ก็ได้สิทธิ์เท่ากับ user ฐานข้อมูลของแอป ไม่ต้องรู้รหัสผ่านอีกต่อไป README ของแพ็กเกจเองก็เตือนว่าให้เปิด autologin คู่กับการกันสิทธิ์เท่านั้น จึงควรใส่ Gate ไว้ด้วยเสมอ
  • เห็นทุกฐานข้อมูลที่ user นั้นเห็น ถ้า DB_USERNAME เป็น root จะเปิดได้ทุกฐานบนเซิร์ฟเวอร์ ให้แอปใช้ user ที่มีสิทธิ์แค่ฐานของแอป ซึ่งก็ควรทำอยู่แล้ว
  • ปุ่ม Logout ของ Adminer ใช้ไม่ได้ กดแล้ว Adminer จะ login กลับเข้ามาทันที ถ้าจะออกให้ logout จากแอปแทน

ปิดไว้เมื่อไม่ใช้ และย้าย URL

ADMINER_ENABLED=false
ADMINER_ROUTE_PREFIX=adminer

ADMINER_ENABLED=false ทำให้แพ็กเกจไม่ลงทะเบียน route เลย ทุกคนได้ 404 บน production จะตั้งเป็น false ไว้ แล้วเปิดเฉพาะตอนต้องใช้ก็ได้

ADMINER_ROUTE_PREFIX เปลี่ยน URL จาก /adminer เป็นชื่ออื่นได้ แต่ให้ใช้ชื่อที่มีคำเดียว เช่น dbadmin ถ้าใส่หลายชั้นอย่าง tools/db หน้า Adminer ยังเปิดได้ แต่ธีมจะหาย เพราะ Adminer โหลด adminer.css แบบ relative ไปหาที่ /tools/adminer.css ถ้าอยากใช้หลายชั้นจริง ๆ ให้ copy ไฟล์ CSS ไปไว้ที่ public/tools/adminer.css ด้วย

เปลี่ยนธีม

Adminer ใช้หน้าตาจาก public/adminer.css ตอน publish จะได้ธีม Hever มา อยากได้ธีมอื่นก็เลือกจากโฟลเดอร์ designs ของ Adminer แล้วเอาไฟล์ adminer.css ของธีมนั้นมาวางทับ รูปนี้คือธีม Dracula

หน้าดูข้อมูลของ Adminer ในธีม Dracula

เพิ่มปลั๊กอิน

Adminer มีปลั๊กอินให้เลือกอีกเยอะ วางไฟล์ปลั๊กอินไว้ใน resources/adminer/plugins (README บางตอนเขียนว่า resources/plugins ซึ่งไม่ถูก) แล้วใส่ชื่อ class ใน config ตัวอย่างนี้ใช้ปลั๊กอิน database-hide.php ซ่อนฐานข้อมูลของระบบออกจากรายการ

'plugins' => [
    'AdminerDatabaseHide' => [['information_schema', 'performance_schema']],
    'AdminerVersionNoverify',
],

array ของ AdminerDatabaseHide ต้องครอบสองชั้น เพราะแพ็กเกจกระจาย array ออกเป็น argument ของ constructor ทีละตัว ส่วน AdminerVersionNoverify ปิดการเช็กเวอร์ชันใหม่กับ adminer.org

ปลั๊กอินนี้แค่ซ่อนชื่อออกจากรายการ ตัวปลั๊กอินเองก็เขียนไว้ว่าไม่ได้ทำมาเพื่อความปลอดภัย ถ้าจะกันจริงต้องกันที่สิทธิ์ของ user ฐานข้อมูล

ข้อควรรู้

  • Adminer เขียนได้ทุกอย่าง ทั้ง UPDATE, DELETE และ DROP TABLE ไม่มีโหมดอ่านอย่างเดียว ถ้าใช้บน production ให้ระวังเหมือนเปิด MySQL client ตรง ๆ
  • Adminer ในแพ็กเกจตามหลังตัวจริง แพ็กเกจรวม Adminer 5.0.4 มา ส่วนตัวล่าสุดของ Adminerไปถึง 6.x แล้ว Adminer จะเช็กกับ adminer.org แล้วขึ้นเลขเวอร์ชันใหม่ไว้มุมซ้ายบนให้รู้
  • README เขียนไว้ตั้งแต่ Laravel รุ่นเก่า ตัวอย่างใน composer.json ยังเป็น ^7.0 และเรื่องเปลี่ยนชื่อฟังก์ชันเป็น adm_ ใช้กับเวอร์ชันเก่าเท่านั้น เวอร์ชัน 8 ใช้ Adminer 5 ที่มี namespace ของตัวเองแล้ว จึงไม่ชนกับ helper ของ Laravel

ถ้าอยากได้แบบอ่านอย่างเดียว

laravel-adminer เหมาะเมื่อเราต้องการ Adminer ครบทุกความสามารถ และคนที่เข้าได้มีแค่เราหรือทีมเล็ก ๆ ที่ไว้ใจกัน ถ้าอยากเปิดให้คนอื่นในทีมดูข้อมูลได้โดยไม่ต้องกลัวเผลอแก้ ผมเขียน laravel-db-console ขึ้นมาแทน ใช้ login และ Gate ของแอปเหมือนกัน แต่ทุก connection เป็นแบบอ่านอย่างเดียวตั้งแต่แรก และคำสั่งแก้โครงสร้างตารางรันไม่ได้เลย

GitHub: onecentlin/laravel-adminer

อ่านต่อ

ล่าสุด

ดูทั้งหมด →