Go Academy · Pelajaran

Middleware Gin: Pengesahan dan Logging

Menulis dan mendaftarkan middleware Gin

Pelajaran 4 daripada 413 langkah

Middleware Gin: Pengesahan dan Logging ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Tandatangan perisian tengah Gin

Perisian tengah Gin ialah gin.HandlerFunc yang memanggil c.Next() untuk menyerahkan kawalan kepada pengendali seterusnya, atau c.Abort() untuk menghentikan rantaian.

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

Menggunakan perisian tengah secara global

Gunakan r.Use untuk menggunakan perisian tengah pada semua laluan:

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

Perisian tengah pengelogan

gin.Logger() terbina dalam Gin merekodkan kaedah, laluan, status dan kependaman. Untuk pengelogan berstruktur, gantikannya dengan perisian tengah tersuai yang menggunakan zap atau 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)),
        )
    }
}

Perisian tengah pengesahan

Sahkan JWT atau kunci API dalam perisian tengah dan hentikan pemprosesan dengan 401 jika tidak sah:

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()
    }
}

Menghantar data melalui konteks

Simpan data dengan c.Set("key", value) dan dapatkannya dalam pengendali dengan c.Get("key") atau pembantu bertip seperti c.MustGet:

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

Perisian tengah pemulihan

gin.Recovery() menangkap panik dan mengembalikan respons 500. Sesuaikannya untuk merekod surih tindanan atau menghantar data kepada perkhidmatan penjejakan ralat:

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

Perisian tengah CORS

Tambahkan pengepala CORS dengan 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,
}))

Perisian tengah pengehad kadar

Gunakan baldi token bagi setiap IP dengan golang.org/x/time/rate dalam perisian tengah untuk mengehadkan kadar permintaan.

Perisian tengah ID permintaan

Jana ID permintaan unik bagi setiap permintaan dan lampirkannya pada konteks serta pengepala respons:

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()
    }
}

Perisian tengah peringkat kumpulan

Gunakan perisian tengah pada kumpulan tertentu dan bukannya secara global:

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

Urutan pelaksanaan perisian tengah

Perisian tengah dijalankan mengikut urutan pendaftaran sebelum pengendali, dan mengikut urutan terbalik selepas c.Next() dikembalikan. Bayangkannya seperti bawang — setiap lapisan membalut lapisan seterusnya.

Semakan Ringkas

Bagaimanakah perisian tengah Gin menghalang permintaan daripada mencapai pengendali?

Imbas Kembali: Perisian Tengah Gin

Perkara utama:

  • HandlerFunc yang mengembalikan gin.HandlerFunc; panggil c.Next() untuk meneruskan
  • c.Set/c.Get untuk menghantar data melalui rantaian
  • c.AbortWithStatusJSON untuk menghentikan rantaian dan menghantar ralat
  • Gunakan secara global dengan r.Use atau mengikut kumpulan dengan group.Use
Percuma untuk bermula

Pelajari Go dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Middleware Gin: Pengesahan dan Logging” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “Middleware Gin: Pengesahan dan Logging”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Middleware Gin: Pengesahan dan Logging”?

Menulis dan mendaftarkan middleware Gin Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Go Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Middleware Gin: Pengesahan dan Logging” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Penghala Gin dan Kumpulan Laluan
  2. Pengikatan dan Pengesahan Permintaan
  3. Pembantu Respons dan Kod Status
  4. Middleware Gin: Pengesahan dan Logging
← Kembali ke Go Academy