0Pricing
Go Academy · Pelajaran

Middleware Gin: Autentikasi dan Logging

Menulis dan mendaftarkan middleware Gin

Middleware Gin: Autentikasi dan Logging adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Signatur perangkat tengah Gin

Perangkat tengah Gin adalah gin.HandlerFunc yang memanggil c.Next() untuk meneruskan kendali ke penangan berikutnya, atau c.Abort() untuk menghentikan rantai.

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

Menerapkan perangkat tengah secara global

Gunakan r.Use untuk menerapkan perangkat tengah ke semua rute:

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

Perangkat tengah pencatatan

gin.Logger() bawaan Gin mencatat metode, jalur, status, dan latensi. Untuk pencatatan terstruktur, gantikan dengan perangkat tengah khusus 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)),
        )
    }
}

Perangkat tengah autentikasi

Validasi JWT atau kunci API di perangkat tengah, lalu batalkan dengan 401 jika tidak valid:

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

Meneruskan data melalui konteks

Simpan data dengan c.Set("key", value) dan ambil kembali di penangan dengan c.Get("key") atau pembantu bertipe seperti c.MustGet:

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

Perangkat tengah pemulihan

gin.Recovery() menangkap kepanikan dan mengembalikan respons 500. Sesuaikan untuk mencatat jejak tumpukan atau mengirimkannya ke layanan pelacakan error:

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

Perangkat tengah CORS

Tambahkan header 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,
}))

Perangkat tengah pembatasan laju

Gunakan keranjang token per IP dengan golang.org/x/time/rate di dalam perangkat tengah untuk membatasi laju permintaan.

Perangkat tengah Request ID

Buat Request ID unik untuk setiap permintaan, lalu tambahkan ke konteks dan header 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()
    }
}

Perangkat tengah tingkat grup

Terapkan perangkat tengah ke grup tertentu, bukan secara global:

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

Urutan eksekusi perangkat tengah

Perangkat tengah berjalan sesuai urutan pendaftaran sebelum penangan, lalu dalam urutan terbalik setelah c.Next() selesai. Bayangkan seperti bawang — setiap lapisan membungkus lapisan berikutnya.

Pemeriksaan Singkat

Bagaimana perangkat tengah Gin menghentikan permintaan agar tidak mencapai penangan?

Ringkasan: Perangkat Tengah Gin

Poin utama:

  • HandlerFunc yang mengembalikan gin.HandlerFunc; panggil c.Next() untuk melanjutkan
  • c.Set/c.Get untuk meneruskan data melalui rantai
  • c.AbortWithStatusJSON untuk menghentikan rantai dan mengirim error
  • Terapkan secara global dengan r.Use atau per grup dengan group.Use

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Middleware Gin: Autentikasi dan Logging” gratis?

Ya — teks lengkap “Middleware Gin: Autentikasi dan Logging” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Middleware Gin: Autentikasi dan Logging”?

Menulis dan mendaftarkan middleware Gin Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Middleware Gin: Autentikasi dan Logging” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Router Gin dan Grup Rute
  2. Pengikatan dan Validasi Permintaan
  3. Pembantu Respons dan Kode Status
  4. Middleware Gin: Autentikasi dan Logging
← Kembali ke Go Academy