[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-access-control-websocket-chat-all--*":3,"academy-blog-translations-ielx8h08fimrsxc":99},{"data":4,"page":87,"perPage":87,"totalItems":87,"totalPages":87},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":93,"keywords":94,"locale":69,"published_at":95,"scheduled_at":13,"school_blog":91,"short_description":96,"slug":97,"status":89,"title":6,"updated":98,"updated_by":13,"views":92},"EP.57 การเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชท (Access Control)","sclblg987654321","school_blog_translations","\u003Cp>ฟีเจอร์การควบคุมการเข้าถึงห้องแชท (Access Control) ช่วยให้ผู้ดูแลห้องแชทสามารถควบคุมและจัดการการเข้าถึงห้องแชทได้ตามสิทธิที่กำหนด โดยผู้ดูแลสามารถอนุมัติหรือปฏิเสธผู้ใช้ที่ต้องการเข้าร่วมในห้องแชทฟีเจอร์นี้ทำให้การสนทนาในห้องแชทมีความปลอดภัยและเป็นระเบียบมากยิ่งขึ้น\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>ทำไมต้องมีฟีเจอร์การควบคุมการเข้าถึงห้องแชท?\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>ฟีเจอร์การควบคุมการเข้าถึงห้องแชทเป็นสิ่งสำคัญสำหรับการจัดการการสนทนาในห้องแชท เพื่อให้ผู้ดูแลห้องแชทสามารถกำหนดได้ว่าใครสามารถเข้าร่วมการสนทนาในห้องนั้นๆ ได้ ฟีเจอร์นี้เหมาะสำหรับการสร้างห้องแชทที่มีความเป็นส่วนตัว หรือห้องแชทที่ต้องการควบคุมสมาชิกเฉพาะกลุ่ม\u003C\u002Fp>\u003Ch3>\u003Cstrong>ข้อดีของการควบคุมการเข้าถึงห้องแชท:\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>เพิ่มความปลอดภัยในการสนทนา\u003C\u002Fstrong>: ทำให้ผู้ดูแลห้องแชทสามารถควบคุมว่าใครสามารถเข้าร่วมการสนทนาได้\u003C\u002Fli>\u003Cli>\u003Cstrong>ช่วยให้การจัดการห้องแชทเป็นระเบียบ\u003C\u002Fstrong>: ผู้ดูแลสามารถจัดการผู้ใช้ที่เข้ามาในห้องแชทได้อย่างมีประสิทธิภาพ\u003C\u002Fli>\u003Cli>\u003Cstrong>เหมาะสำหรับห้องแชทที่ต้องการความเป็นส่วนตัว\u003C\u002Fstrong>: ผู้ดูแลสามารถเลือกได้ว่าผู้ใดที่สามารถเข้าร่วมได้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>โครงสร้างของฟีเจอร์การควบคุมการเข้าถึงห้องแชท\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>ฟีเจอร์การควบคุมการเข้าถึงห้องแชทจำเป็นต้องมีการตรวจสอบสิทธิ์ของผู้ใช้ในระบบ โดยจะต้องเชื่อมโยงกับข้อมูลผู้ใช้ในฐานข้อมูลและตรวจสอบว่าผู้ใช้คนใดสามารถเข้าร่วมการสนทนาในห้องนั้นได้\u003C\u002Fp>\u003Ch3>\u003Cstrong>ส่วนประกอบหลักของระบบการควบคุมการเข้าถึงห้องแชท:\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>การเก็บข้อมูลผู้ใช้ในฐานข้อมูล\u003C\u002Fstrong>: ข้อมูลเกี่ยวกับผู้ใช้ เช่น สิทธิ์การเข้าร่วมจะต้องถูกเก็บในฐานข้อมูล\u003C\u002Fli>\u003Cli>\u003Cstrong>การตรวจสอบสิทธิ์การเข้าถึง\u003C\u002Fstrong>: ระบบจะต้องสามารถตรวจสอบสิทธิ์ของผู้ใช้และอนุมัติหรือปฏิเสธการเข้าร่วม\u003C\u002Fli>\u003Cli>\u003Cstrong>การจัดการการเข้าถึงห้องแชท\u003C\u002Fstrong>: เมื่อผู้ใช้พยายามเข้าร่วมห้องแชท ระบบจะต้องสามารถอนุมัติหรือปฏิเสธการเข้าร่วมได้ตามสิทธิ์ของผู้ใช้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>วิธีการเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชทใน WebSocket Server\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>การอัปเดต WebSocket Server เพื่อรองรับการควบคุมการเข้าถึงห้องแชทใน WebSocket Chat โดยใช้ระบบสิทธิ์และการตรวจสอบผู้ใช้ที่เข้าร่วม\u003C\u002Fp>\u003Ch3>\u003Cstrong>ขั้นตอนที่ต้องทำ:\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>การอัปเดต WebSocket Server เพื่อรองรับการตรวจสอบการเข้าถึงห้องแชท\u003C\u002Fstrong>: เซิร์ฟเวอร์ต้องสามารถตรวจสอบสิทธิ์ของผู้ใช้ในห้องแชทได้\u003C\u002Fli>\u003Cli>\u003Cstrong>การอัปเดตฐานข้อมูล\u003C\u002Fstrong>: เราต้องเพิ่มคอลัมน์หรือฟิลด์ที่ใช้จัดเก็บข้อมูลสิทธิ์ของผู้ใช้ เช่น \u003Ccode inline=\"\">access_level\u003C\u002Fcode>\u003C\u002Fli>\u003Cli>\u003Cstrong>การอนุมัติหรือปฏิเสธการเข้าร่วม\u003C\u002Fstrong>: เมื่อมีผู้ใช้พยายามเข้าร่วมห้องแชท ระบบจะต้องสามารถอนุมัติหรือปฏิเสธการเข้าร่วมได้ตามสิทธิ์ของผู้ใช้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>การสร้าง UI สำหรับการควบคุมการเข้าถึงห้องแชท\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>เพื่อให้ผู้ดูแลห้องแชทสามารถจัดการการเข้าร่วมของผู้ใช้ได้ เราจะเพิ่ม UI ที่ให้ผู้ดูแลสามารถอนุมัติหรือปฏิเสธการเข้าห้องแชทได้\u003C\u002Fp>\u003Ch3>\u003Cstrong>ส่วนประกอบของ UI:\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>เพิ่มปุ่ม \"อนุมัติ\" หรือ \"ปฏิเสธ\" ใน UI\u003C\u002Fstrong>: ให้ผู้ดูแลห้องแชทสามารถอนุมัติหรือปฏิเสธผู้ที่ต้องการเข้าห้องแชท\u003C\u002Fli>\u003Cli>\u003Cstrong>แสดงสถานะการเข้าถึง\u003C\u002Fstrong>: UI จะแสดงสถานะของผู้ใช้ในห้องแชท เช่น \"เข้าร่วมแล้ว\", \"รออนุมัติ\" หรือ \"ถูกปฏิเสธ\"\u003C\u002Fli>\u003Cli>\u003Cstrong>แสดงรายชื่อผู้ที่รออนุมัติ\u003C\u002Fstrong>: UI จะมีฟีเจอร์แสดงรายชื่อผู้ที่ยังไม่ได้รับอนุมัติให้เข้าห้องแชท\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>การทดสอบฟีเจอร์การควบคุมการเข้าถึงห้องแชท\u003C\u002Fstrong>\u003C\u002Fh2>\u003Cp>หลังจากเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชทแล้ว เราต้องทดสอบว่าระบบทำงานได้ตามที่คาดหวัง\u003C\u002Fp>\u003Ch3>\u003Cstrong>การทดสอบที่ควรทำ:\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cstrong>ทดสอบการตรวจสอบสิทธิ์ผู้ใช้\u003C\u002Fstrong>: ทดสอบว่าเมื่อผู้ใช้พยายามเข้าร่วมห้องแชท ระบบสามารถตรวจสอบสิทธิ์และอนุมัติหรือปฏิเสธการเข้าร่วมได้\u003C\u002Fli>\u003Cli>\u003Cstrong>ทดสอบการแสดงสถานะผู้ใช้ใน UI\u003C\u002Fstrong>: ตรวจสอบว่า UI แสดงสถานะการเข้าถึงห้องแชทของผู้ใช้ได้ถูกต้อง\u003C\u002Fli>\u003Cli>\u003Cstrong>ทดสอบการจัดการห้องแชทโดยผู้ดูแล\u003C\u002Fstrong>: ทดสอบว่าผู้ดูแลสามารถอนุมัติและปฏิเสธผู้ใช้ได้ตามสิทธิ์\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>\u003Cstrong>ตัวอย่างโค้ดสำหรับการควบคุมการเข้าถึงห้องแชทใน WebSocket Chat\u003C\u002Fstrong>\u003C\u002Fh2>\u003Col>\u003Cli>\u003Ch3>\u003Cstrong>การอัปเดตฐานข้อมูล (Database)\u003C\u002Fstrong>\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>เพิ่มคอลัมน์ \u003Ccode inline=\"\">access_level\u003C\u002Fcode> เพื่อเก็บข้อมูลสิทธิ์การเข้าร่วมห้องแชทของผู้ใช้\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-sql\">ALTER TABLE users ADD COLUMN access_level VARCHAR(50) DEFAULT 'guest';\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Col start=\"2\">\u003Cli>\u003Ch3>\u003Cstrong>โค้ดใน WebSocket Server (Backend)\u003C\u002Fstrong>\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>อัปเดต WebSocket Server เพื่อรองรับการตรวจสอบสิทธิ์การเข้าร่วมห้องแชท\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"database\u002Fsql\"\n    \"encoding\u002Fjson\"\n    \"fmt\"\n    \"net\u002Fhttp\"\n    \"sync\"\n\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n    _ \"github.com\u002Flib\u002Fpq\"\n)\n\ntype AccessRequest struct {\n    Username string `json:\"username\"`\n    RoomID   string `json:\"roomID\"`\n}\n\ntype AccessResponse struct {\n    Success bool   `json:\"success\"`\n    Message string `json:\"message\"`\n}\n\nvar (\n    clients   = make(map[*websocket.Conn]bool)\n    broadcast = make(chan AccessResponse)\n    mu        sync.Mutex\n    db        *sql.DB\n)\n\nfunc handleAccessControl(w http.ResponseWriter, r *http.Request) {\n    conn, _ := upgrader.Upgrade(w, r, nil)\n    defer conn.Close()\n    clients[conn] = true\n\n    for {\n        var request AccessRequest\n        err := conn.ReadJSON(&amp;request)\n        if err != nil {\n            delete(clients, conn)\n            break\n        }\n\n        var accessLevel string\n        err = db.QueryRow(\"SELECT access_level FROM users WHERE username = $1\", request.Username).Scan(&amp;accessLevel)\n        if err != nil {\n            broadcast &lt;- AccessResponse{Success: false, Message: \"User not found\"}\n            continue\n        }\n\n        if accessLevel == \"admin\" {\n            broadcast &lt;- AccessResponse{Success: true, Message: \"Access granted\"}\n        } else {\n            broadcast &lt;- AccessResponse{Success: false, Message: \"Access denied\"}\n        }\n    }\n}\n\nfunc notifyClients() {\n    for {\n        msg := &lt;-broadcast\n        for client := range clients {\n            err := client.WriteJSON(msg)\n            if err != nil {\n                client.Close()\n                delete(clients, client)\n            }\n        }\n    }\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleAccessControl)\n    go notifyClients()\n    fmt.Println(\"WebSocket Server Running on Port 8080\")\n    http.ListenAndServe(\":8080\", nil)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Col start=\"3\">\u003Cli>\u003Ch3>\u003Cstrong>โค้ดใน Frontend (Client)\u003C\u002Fstrong>\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>เพิ่ม UI สำหรับการจัดการการเข้าห้องแชท\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-javascript\">const socket = new WebSocket(\"ws:\u002F\u002Flocalhost:8080\u002Fws\");\nconst chatContainer = document.getElementById(\"chat-container\");\n\nsocket.onmessage = (event) =&gt; {\n    const data = JSON.parse(event.data);\n    const messageElement = document.createElement(\"p\");\n    messageElement.innerText = data.message;\n    chatContainer.appendChild(messageElement);\n};\n\nfunction requestAccess(username, roomID) {\n    socket.send(JSON.stringify({ username, roomID }));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>\u003Cstrong>ท้าให้ลอง!\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cp>ลองเพิ่มฟีเจอร์ \u003Cstrong>การแสดงสถานะการเข้าถึงห้องแชท\u003C\u002Fstrong> เพื่อให้ผู้ใช้สามารถเห็นสถานะการเข้าถึงห้องแชทได้อย่างชัดเจน!\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>EP ถัดไป:\u003C\u002Fstrong>\u003Cbr>ใน EP ถัดไป เราจะมาดู \u003Cstrong>การเพิ่มฟีเจอร์การแจ้งเตือนแบบพุช (Push Notification)\u003C\u002Fstrong> เพื่อให้ผู้ใช้สามารถรับการแจ้งเตือนในขณะมีข้อความใหม่หรือการเปลี่ยนแปลงสำคัญในห้องแชท!\u003C\u002Fp>","85_11zon_6t4lm3c2p6.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F2381m4bafuusepx\u002F85_11zon_6t4lm3c2p6.webp","2026-03-04 08:48:40.666Z","",{"keywords":15,"locale":63,"school_blog":73},[16,23,28,33,38,43,48,53,58],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:44:48.724Z","s6xhnfomy7n5ycp","WebSocket Server","2026-04-10 16:12:50.171Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:48:39.055Z","ktwpd8009t428ea","real-time access control","2026-04-10 16:13:51.710Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:48:37.086Z","lyvc6m6wy8i75nq","การพัฒนาแอปพลิเคชันแชท","2026-04-10 16:13:51.062Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:48:37.396Z","7rautg2afwgj00c","ฟีเจอร์ WebSocket","2026-04-10 16:13:51.129Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:48:38.634Z","6lj1eoz26dsxxsy","user management in chat rooms","2026-04-10 16:13:51.644Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:48:38.290Z","1nyt0wqcgvcl9vm","chat room access control","2026-04-10 16:13:51.490Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:48:37.970Z","axhdcbnxy7jl4ge","WebSocket chat access","2026-04-10 16:13:51.423Z",{"collectionId":17,"collectionName":18,"created":59,"created_by":13,"id":60,"name":61,"updated":62,"updated_by":13},"2026-03-04 08:48:37.762Z","8uw33w756fmqerq","Access control WebSocket","2026-04-10 16:13:51.290Z",{"code":64,"collectionId":65,"collectionName":66,"created":67,"flag":68,"id":69,"is_default":70,"label":71,"updated":72},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":74,"collectionId":75,"collectionName":76,"expand":77,"id":91,"views":92},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":78},{"blogIds":79,"collectionId":80,"collectionName":81,"created":82,"created_by":13,"id":74,"image":83,"image_alt":13,"image_path":84,"label":85,"name":86,"priority":87,"publish_at":88,"scheduled_at":13,"status":89,"updated":90,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":86,"th":86},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","ielx8h08fimrsxc",242,"2381m4bafuusepx",[20,25,30,35,40,45,50,55,60],"2025-06-27 11:11:56.769Z","เรียนรู้วิธีการเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชทใน WebSocket Chat เพื่อให้ผู้ดูแลสามารถควบคุมการเข้าถึงห้องแชทได้ตามสิทธิที่กำหนด","access-control-websocket-chat","2026-04-22 07:10:13.405Z",{"th":97}]