Что такое AAA

Ответ

AAA (Authentication, Authorization, Accounting) — это концепция безопасности, описывающая три ключевых процесса:

  1. Authentication — проверка подлинности пользователя (логин/пароль, OAuth, биометрия).
  2. Authorization — определение прав доступа (роли, разрешения).
  3. Accounting — учёт действий (логирование, аудит).

Пример в Go (аутентификация + авторизация):

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

// Mock JWT validation and claims parsing for demonstration
func validateToken(token string) bool {
    // In a real app, this would validate JWT signature, expiration, etc.
    return token == "Bearer valid_jwt_token"
}

type Claims struct {
    Role string
    User string
}

func parseToken(token string) Claims {
    // In a real app, this would parse JWT claims
    if token == "Bearer valid_jwt_token" {
        return Claims{Role: "admin", User: "john.doe"}
    }
    return Claims{Role: "guest", User: "anonymous"}
}

func authMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 1. Authentication (e.g., JWT token validation)
        token := r.Header.Get("Authorization")
        if !validateToken(token) {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }

        // 2. Authorization (e.g., check user role from token claims)
        claims := parseToken(token)
        if claims.Role != "admin" {
            http.Error(w, "Forbidden: Admin access required", http.StatusForbidden)
            return
        }

        // 3. Accounting (logging user actions)
        log.Printf("[%s] Access granted for user '%s' (Role: %s) to %s %s from %s", 
            time.Now().Format(time.RFC3339), claims.User, claims.Role, r.Method, r.URL.Path, r.RemoteAddr)

        // If all checks pass, proceed to the next handler
        next.ServeHTTP(w, r)
    })
}

func adminHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Welcome, Admin! This is a restricted area.")
}

func main() {
    // Apply the AAA middleware to a specific route
    http.Handle("/admin", authMiddleware(http.HandlerFunc(adminHandler)))

    fmt.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Как протестировать (cURL):

  • Неавторизованный доступ: curl -v http://localhost:8080/admin (Ожидаемый ответ: 401 Unauthorized)

  • Авторизованный, но без нужной роли (или невалидный токен): curl -v -H "Authorization: Bearer invalid_token" http://localhost:8080/admin (Ожидаемый ответ: 401 Unauthorized)

  • Авторизованный с нужной ролью: curl -v -H "Authorization: Bearer valid_jwt_token" http://localhost:8080/admin (Ожидаемый ответ: 200 OK, "Welcome, Admin! This is a restricted area.")