Go Academy · Урок

Промежуточные обработчики Gin: аутентификация и журналирование

Написание и регистрация промежуточных обработчиков Gin

Урок 4 из 413 шагов

«Промежуточные обработчики Gin: аутентификация и журналирование» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 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() записывает в журнал метод, путь, статус и задержку. Для структурированного ведения журналов замените его пользовательским промежуточным ПО на основе 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)

Промежуточное ПО Recovery

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 внутри промежуточного ПО, чтобы ограничить частоту запросов.

Промежуточное ПО идентификатора запроса

Генерируйте уникальный идентификатор для каждого запроса и добавляйте его в контекст и заголовок ответа:

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 с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Промежуточные обработчики Gin: аутентификация и журналирование» бесплатный?

Да — полный текст урока «Промежуточные обработчики Gin: аутентификация и журналирование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Промежуточные обработчики Gin: аутентификация и журналирование»?

Написание и регистрация промежуточных обработчиков Gin Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 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