Ответ
AAA (Authentication, Authorization, Accounting) — это концепция безопасности, описывающая три ключевых процесса:
- Authentication — проверка подлинности пользователя (логин/пароль, OAuth, биометрия).
- Authorization — определение прав доступа (роли, разрешения).
- 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.")