Промежуточные обработчики Gin: аутентификация и журналирование
Написание и регистрация промежуточных обработчиков Gin
«Промежуточные обработчики 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 — локальная установка не требуется.
Все уроки этого курса
- Маршрутизатор Gin и группы маршрутов
- Привязка и проверка запросов
- Вспомогательные средства ответов и коды состояния
- Промежуточные обработчики Gin: аутентификация и журналирование