B22: прикладное логирование vector.* + администрирование в доках (по образцу РВС)
- backend/logging_setup.py: setup_logging() (stdout INFO + файл /tmp/vector/vector.log,
ротация 5×2 МБ, VectorLOGLEVEL/VectorLOGFILE/VectorLOGDIR), get_logger('vector.*')
- события: vector.analyze (матрасчёт с длительностью), vector.auth (login_ok/failed/
lockout), vector.audit (каждая запись), vector.contour (ok/failed/rejected),
vector.operations (operation_complete), vector.geocode (успех/timeout/ошибка)
- существующие логгеры переведены в namespace vector.* (geo, geo.osm, rules, water, admin)
- README §13а: таблица наблюдаемых событий + правила (без ПДн/секретов)
- SETUP_GUIDE: §15 RPO/RTO + backup≠restore, §16 grep по vector.*, §17 диагностика
по цепочкам (БД, 500, fallback-зоны, вход), §17а чек-лист передачи проекта
- DEPLOY.md: вместо устаревшего дубля — ссылка на актуальные доки + шпаргалка стенда
- тесты: 239 passed
This commit is contained in:
@@ -15,8 +15,11 @@ from sqlalchemy import text
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from backend.database import get_db
|
||||
from backend.logging_setup import get_logger
|
||||
from backend.models import AuthEvent, SecuritySetting, User, UserSession
|
||||
|
||||
log = get_logger('auth')
|
||||
|
||||
router = APIRouter(prefix='/api/v1/auth', tags=['auth'])
|
||||
security = HTTPBearer(auto_error=False)
|
||||
SECRET_KEY = os.getenv('JWT_SECRET', 'change-me-in-production')
|
||||
@@ -127,9 +130,15 @@ def _register_failed_login(db: Session, user: User, request: Request | None) ->
|
||||
user.failed_login_count = (user.failed_login_count or 0) + 1
|
||||
if user.failed_login_count >= max_failed:
|
||||
user.locked_until = datetime.now(timezone.utc) + timedelta(minutes=lockout_min)
|
||||
log.warning('lockout user=%s неудачных=%d блокировка=%dмин ip=%s',
|
||||
user.username, user.failed_login_count, lockout_min,
|
||||
request.client.host if request and request.client else '—')
|
||||
_log_auth(db, 'lockout', user.username, user.id, request,
|
||||
{'failed_count': user.failed_login_count})
|
||||
else:
|
||||
log.warning('login_failed user=%s неудачных=%d ip=%s',
|
||||
user.username, user.failed_login_count,
|
||||
request.client.host if request and request.client else '—')
|
||||
_log_auth(db, 'login_failed', user.username, user.id, request,
|
||||
{'failed_count': user.failed_login_count})
|
||||
db.commit()
|
||||
@@ -371,6 +380,9 @@ def login(
|
||||
user.last_login = datetime.now(timezone.utc)
|
||||
_log_auth(db, 'login', user.username, user.id, request)
|
||||
db.commit()
|
||||
log.info('login_ok user=%s ip=%s',
|
||||
getattr(user, 'username', '—'),
|
||||
request.client.host if request.client else '—')
|
||||
|
||||
token = create_access_token(
|
||||
{'sub': user.username, 'role': user.role, 'sid': sid_secret},
|
||||
|
||||
Reference in New Issue
Block a user