การดู : 0

12/04/2026 18:17น.

EP.57 การเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชท (Access Control)

EP.57 การเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชท (Access Control)

#Go

#WebSocket Server

#real-time access control

#การพัฒนาแอปพลิเคชันแชท

#ฟีเจอร์ WebSocket

#user management in chat rooms

#chat room access control

#WebSocket chat access

#Access control WebSocket

ฟีเจอร์การควบคุมการเข้าถึงห้องแชท (Access Control) ช่วยให้ผู้ดูแลห้องแชทสามารถควบคุมและจัดการการเข้าถึงห้องแชทได้ตามสิทธิที่กำหนด โดยผู้ดูแลสามารถอนุมัติหรือปฏิเสธผู้ใช้ที่ต้องการเข้าร่วมในห้องแชทฟีเจอร์นี้ทำให้การสนทนาในห้องแชทมีความปลอดภัยและเป็นระเบียบมากยิ่งขึ้น

 

ทำไมต้องมีฟีเจอร์การควบคุมการเข้าถึงห้องแชท?

ฟีเจอร์การควบคุมการเข้าถึงห้องแชทเป็นสิ่งสำคัญสำหรับการจัดการการสนทนาในห้องแชท เพื่อให้ผู้ดูแลห้องแชทสามารถกำหนดได้ว่าใครสามารถเข้าร่วมการสนทนาในห้องนั้นๆ ได้ ฟีเจอร์นี้เหมาะสำหรับการสร้างห้องแชทที่มีความเป็นส่วนตัว หรือห้องแชทที่ต้องการควบคุมสมาชิกเฉพาะกลุ่ม

ข้อดีของการควบคุมการเข้าถึงห้องแชท:

  • เพิ่มความปลอดภัยในการสนทนา: ทำให้ผู้ดูแลห้องแชทสามารถควบคุมว่าใครสามารถเข้าร่วมการสนทนาได้
  • ช่วยให้การจัดการห้องแชทเป็นระเบียบ: ผู้ดูแลสามารถจัดการผู้ใช้ที่เข้ามาในห้องแชทได้อย่างมีประสิทธิภาพ
  • เหมาะสำหรับห้องแชทที่ต้องการความเป็นส่วนตัว: ผู้ดูแลสามารถเลือกได้ว่าผู้ใดที่สามารถเข้าร่วมได้

 

โครงสร้างของฟีเจอร์การควบคุมการเข้าถึงห้องแชท

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

ส่วนประกอบหลักของระบบการควบคุมการเข้าถึงห้องแชท:

  • การเก็บข้อมูลผู้ใช้ในฐานข้อมูล: ข้อมูลเกี่ยวกับผู้ใช้ เช่น สิทธิ์การเข้าร่วมจะต้องถูกเก็บในฐานข้อมูล
  • การตรวจสอบสิทธิ์การเข้าถึง: ระบบจะต้องสามารถตรวจสอบสิทธิ์ของผู้ใช้และอนุมัติหรือปฏิเสธการเข้าร่วม
  • การจัดการการเข้าถึงห้องแชท: เมื่อผู้ใช้พยายามเข้าร่วมห้องแชท ระบบจะต้องสามารถอนุมัติหรือปฏิเสธการเข้าร่วมได้ตามสิทธิ์ของผู้ใช้

 

วิธีการเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชทใน WebSocket Server

การอัปเดต WebSocket Server เพื่อรองรับการควบคุมการเข้าถึงห้องแชทใน WebSocket Chat โดยใช้ระบบสิทธิ์และการตรวจสอบผู้ใช้ที่เข้าร่วม

ขั้นตอนที่ต้องทำ:

  • การอัปเดต WebSocket Server เพื่อรองรับการตรวจสอบการเข้าถึงห้องแชท: เซิร์ฟเวอร์ต้องสามารถตรวจสอบสิทธิ์ของผู้ใช้ในห้องแชทได้
  • การอัปเดตฐานข้อมูล: เราต้องเพิ่มคอลัมน์หรือฟิลด์ที่ใช้จัดเก็บข้อมูลสิทธิ์ของผู้ใช้ เช่น access_level
  • การอนุมัติหรือปฏิเสธการเข้าร่วม: เมื่อมีผู้ใช้พยายามเข้าร่วมห้องแชท ระบบจะต้องสามารถอนุมัติหรือปฏิเสธการเข้าร่วมได้ตามสิทธิ์ของผู้ใช้

 

การสร้าง UI สำหรับการควบคุมการเข้าถึงห้องแชท

เพื่อให้ผู้ดูแลห้องแชทสามารถจัดการการเข้าร่วมของผู้ใช้ได้ เราจะเพิ่ม UI ที่ให้ผู้ดูแลสามารถอนุมัติหรือปฏิเสธการเข้าห้องแชทได้

ส่วนประกอบของ UI:

  • เพิ่มปุ่ม "อนุมัติ" หรือ "ปฏิเสธ" ใน UI: ให้ผู้ดูแลห้องแชทสามารถอนุมัติหรือปฏิเสธผู้ที่ต้องการเข้าห้องแชท
  • แสดงสถานะการเข้าถึง: UI จะแสดงสถานะของผู้ใช้ในห้องแชท เช่น "เข้าร่วมแล้ว", "รออนุมัติ" หรือ "ถูกปฏิเสธ"
  • แสดงรายชื่อผู้ที่รออนุมัติ: UI จะมีฟีเจอร์แสดงรายชื่อผู้ที่ยังไม่ได้รับอนุมัติให้เข้าห้องแชท

 

การทดสอบฟีเจอร์การควบคุมการเข้าถึงห้องแชท

หลังจากเพิ่มฟีเจอร์การควบคุมการเข้าถึงห้องแชทแล้ว เราต้องทดสอบว่าระบบทำงานได้ตามที่คาดหวัง

การทดสอบที่ควรทำ:

  • ทดสอบการตรวจสอบสิทธิ์ผู้ใช้: ทดสอบว่าเมื่อผู้ใช้พยายามเข้าร่วมห้องแชท ระบบสามารถตรวจสอบสิทธิ์และอนุมัติหรือปฏิเสธการเข้าร่วมได้
  • ทดสอบการแสดงสถานะผู้ใช้ใน UI: ตรวจสอบว่า UI แสดงสถานะการเข้าถึงห้องแชทของผู้ใช้ได้ถูกต้อง
  • ทดสอบการจัดการห้องแชทโดยผู้ดูแล: ทดสอบว่าผู้ดูแลสามารถอนุมัติและปฏิเสธผู้ใช้ได้ตามสิทธิ์

 

ตัวอย่างโค้ดสำหรับการควบคุมการเข้าถึงห้องแชทใน WebSocket Chat

  1. การอัปเดตฐานข้อมูล (Database)

เพิ่มคอลัมน์ access_level เพื่อเก็บข้อมูลสิทธิ์การเข้าร่วมห้องแชทของผู้ใช้

ALTER TABLE users ADD COLUMN access_level VARCHAR(50) DEFAULT 'guest';
  1. โค้ดใน WebSocket Server (Backend)

อัปเดต WebSocket Server เพื่อรองรับการตรวจสอบสิทธิ์การเข้าร่วมห้องแชท

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "net/http"
    "sync"

    "github.com/gorilla/websocket"
    _ "github.com/lib/pq"
)

type AccessRequest struct {
    Username string `json:"username"`
    RoomID   string `json:"roomID"`
}

type AccessResponse struct {
    Success bool   `json:"success"`
    Message string `json:"message"`
}

var (
    clients   = make(map[*websocket.Conn]bool)
    broadcast = make(chan AccessResponse)
    mu        sync.Mutex
    db        *sql.DB
)

func handleAccessControl(w http.ResponseWriter, r *http.Request) {
    conn, _ := upgrader.Upgrade(w, r, nil)
    defer conn.Close()
    clients[conn] = true

    for {
        var request AccessRequest
        err := conn.ReadJSON(&request)
        if err != nil {
            delete(clients, conn)
            break
        }

        var accessLevel string
        err = db.QueryRow("SELECT access_level FROM users WHERE username = $1", request.Username).Scan(&accessLevel)
        if err != nil {
            broadcast <- AccessResponse{Success: false, Message: "User not found"}
            continue
        }

        if accessLevel == "admin" {
            broadcast <- AccessResponse{Success: true, Message: "Access granted"}
        } else {
            broadcast <- AccessResponse{Success: false, Message: "Access denied"}
        }
    }
}

func notifyClients() {
    for {
        msg := <-broadcast
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                client.Close()
                delete(clients, client)
            }
        }
    }
}

func main() {
    http.HandleFunc("/ws", handleAccessControl)
    go notifyClients()
    fmt.Println("WebSocket Server Running on Port 8080")
    http.ListenAndServe(":8080", nil)
}
  1. โค้ดใน Frontend (Client)

เพิ่ม UI สำหรับการจัดการการเข้าห้องแชท

const socket = new WebSocket("ws://localhost:8080/ws");
const chatContainer = document.getElementById("chat-container");

socket.onmessage = (event) => {
    const data = JSON.parse(event.data);
    const messageElement = document.createElement("p");
    messageElement.innerText = data.message;
    chatContainer.appendChild(messageElement);
};

function requestAccess(username, roomID) {
    socket.send(JSON.stringify({ username, roomID }));
}

 


 

ท้าให้ลอง!

ลองเพิ่มฟีเจอร์ การแสดงสถานะการเข้าถึงห้องแชท เพื่อให้ผู้ใช้สามารถเห็นสถานะการเข้าถึงห้องแชทได้อย่างชัดเจน!

 

EP ถัดไป:
ใน EP ถัดไป เราจะมาดู การเพิ่มฟีเจอร์การแจ้งเตือนแบบพุช (Push Notification) เพื่อให้ผู้ใช้สามารถรับการแจ้งเตือนในขณะมีข้อความใหม่หรือการเปลี่ยนแปลงสำคัญในห้องแชท!