Ответ
Важно различать два понятия:
- Аутентификация (Authentication) — проверка того, кем является пользователь (например, по логину и паролю).
- Авторизация (Authorization) — проверка того, какие действия разрешены аутентифицированному пользователю.
1. Аутентификация
Для stateless-сервисов (API, микросервисы) самым популярным подходом является JWT (JSON Web Tokens).
- Принцип: После успешного входа пользователя сервер генерирует токен, содержащий информацию о пользователе (ID, роли), и подписывает его секретным ключом. Клиент отправляет этот токен в заголовке
Authorization
при каждом запросе. - Преимущества: Не требует хранения сессий на сервере, легко масштабируется.
Пример middleware для проверки JWT:
func JWTMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
return []byte("your-secret-key"), nil
})
if err != nil || !token.Valid {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// Можно передать claims пользователя дальше через контекст
// ctx := context.WithValue(r.Context(), "userClaims", claims)
// next.ServeHTTP(w, r.WithContext(ctx))
next.ServeHTTP(w, r)
})
}
2. Авторизация
После того как пользователь аутентифицирован, нужно проверить его права. Распространенные паттерны:
- RBAC (Role-Based Access Control): Самый частый подход. Пользователям назначаются роли (например,
admin
,user
,editor
), а разрешения привязываются к ролям. Например, только рольadmin
может удалять пользователей. - ABAC (Attribute-Based Access Control): Более гибкий подход. Доступ определяется на основе атрибутов пользователя, запрашиваемого ресурса и окружения (например, разрешить доступ, только если пользователь из того же отдела и в рабочее время).
Для реализации сложных политик авторизации часто используют библиотеки, например, Casbin, которая позволяет определять правила доступа в конфигурационном файле и проверять их в коде.