Go Academy · บทเรียน

มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก

เขียนและลงทะเบียนมิดเดิลแวร์ของ Gin

บทเรียน 4 จาก 413 ขั้นตอน

มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

ลายเซ็นของมิดเดิลแวร์ Gin

มิดเดิลแวร์ Gin คือ gin.HandlerFunc ที่เรียก c.Next() เพื่อส่งต่อการควบคุมไปยังตัวจัดการถัดไป หรือเรียก c.Abort() เพื่อหยุดสายการทำงาน

func MyMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // before handler
        c.Next()
        // after handler
    }
}

การใช้มิดเดิลแวร์ทั่วทั้งระบบ

ใช้ r.Use เพื่อใช้มิดเดิลแวร์กับเส้นทางทั้งหมด:

r := gin.New()
r.Use(gin.Logger())
r.Use(gin.Recovery())

มิดเดิลแวร์สำหรับการบันทึกล็อก

gin.Logger() ในตัวของ Gin จะบันทึกเมธอด เส้นทาง สถานะ และเวลาแฝง หากต้องการการบันทึกแบบมีโครงสร้าง ให้แทนที่ด้วยมิดเดิลแวร์แบบกำหนดเองที่ใช้ zap หรือ slog:

func ZapLogger(logger *zap.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        c.Next()
        logger.Info("request",
            zap.String("method", c.Request.Method),
            zap.String("path", c.FullPath()),
            zap.Int("status", c.Writer.Status()),
            zap.Duration("latency", time.Since(start)),
        )
    }
}

มิดเดิลแวร์สำหรับการยืนยันตัวตน

ตรวจสอบ JWT หรือคีย์ API ในมิดเดิลแวร์ และยกเลิกการทำงานพร้อมสถานะ 401 หากไม่ถูกต้อง:

func AuthRequired() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        claims, err := validateJWT(token)
        if err != nil {
            c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
            return
        }
        c.Set("user", claims)
        c.Next()
    }
}

การส่งข้อมูลผ่านบริบท

จัดเก็บข้อมูลด้วย c.Set("key", value) และดึงข้อมูลในตัวจัดการด้วย c.Get("key") หรือฟังก์ชันช่วยเหลือที่มีชนิด เช่น c.MustGet:

user, _ := c.Get("user")
claims := user.(*Claims)

มิดเดิลแวร์กู้คืน

gin.Recovery() ดักจับแพนิกและส่งการตอบกลับ 500 สามารถปรับแต่งให้บันทึกสแต็กเทรซหรือส่งไปยังบริการติดตามข้อผิดพลาดได้:

r.Use(gin.CustomRecovery(func(c *gin.Context, recovered any) {
    log.Printf("panic: %v", recovered)
    c.AbortWithStatusJSON(500, gin.H{"error": "internal server error"})
}))

มิดเดิลแวร์ CORS

เพิ่มส่วนหัว CORS ด้วย github.com/gin-contrib/cors:

r.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"https://example.com"},
    AllowMethods:     []string{"GET", "POST", "PUT"},
    AllowHeaders:     []string{"Authorization", "Content-Type"},
    AllowCredentials: true,
}))

มิดเดิลแวร์จำกัดอัตรา

ใช้บักเก็ตโทเคนแยกตาม IP ร่วมกับ golang.org/x/time/rate ภายในมิดเดิลแวร์เพื่อจำกัดอัตราคำขอ

มิดเดิลแวร์สำหรับ ID คำขอ

สร้าง ID คำขอที่ไม่ซ้ำกันสำหรับแต่ละคำขอ แล้วแนบไว้กับบริบทและส่วนหัวการตอบกลับ:

func RequestID() gin.HandlerFunc {
    return func(c *gin.Context) {
        id := uuid.New().String()
        c.Set("requestID", id)
        c.Header("X-Request-ID", id)
        c.Next()
    }
}

มิดเดิลแวร์ระดับกลุ่ม

ใช้มิดเดิลแวร์กับกลุ่มใดกลุ่มหนึ่งแทนการใช้ทั่วทั้งระบบ:

admin := r.Group("/admin")
admin.Use(AuthRequired(), AdminOnly())
admin.GET("/users", listUsers)

ลำดับการทำงานของมิดเดิลแวร์

มิดเดิลแวร์จะทำงานตามลำดับการลงทะเบียนก่อนตัวจัดการ และทำงานย้อนลำดับหลังจาก c.Next() ส่งคืนค่า ลองนึกภาพว่าเป็นหัวหอม โดยแต่ละชั้นจะห่อหุ้มชั้นถัดไป

ตรวจสอบอย่างรวดเร็ว

มิดเดิลแวร์ Gin หยุดไม่ให้คำขอไปถึงตัวจัดการได้อย่างไร

ทบทวน: มิดเดิลแวร์ Gin

ประเด็นสำคัญ:

  • HandlerFunc ที่ส่งคืน gin.HandlerFunc และเรียก c.Next() เพื่อทำงานต่อ
  • ใช้ c.Set/c.Get เพื่อส่งข้อมูลผ่านสายการทำงาน
  • ใช้ c.AbortWithStatusJSON เพื่อหยุดสายการทำงานและส่งข้อผิดพลาด
  • ใช้ทั่วทั้งระบบด้วย r.Use หรือใช้เฉพาะกลุ่มด้วย group.Use
เริ่มต้นได้ฟรี

เรียนรู้ Go ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก”

เขียนและลงทะเบียนมิดเดิลแวร์ของ Gin คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เราเตอร์ Gin และกลุ่มเส้นทาง
  2. การผูกคำขอและการตรวจสอบ
  3. ตัวช่วยการตอบกลับและรหัสสถานะ
  4. มิดเดิลแวร์ Gin: การยืนยันตัวตนและการบันทึก
← กลับไปที่ Go Academy