architect/_archive/2025-11-26-cleanup/templates/by-feature/auth/streamlit-auth-v1/README.md

Template: Streamlit Authentication v1

ID: streamlit-auth-v1
Категория: auth
Фреймворк: Streamlit
Сложность: Medium
Время адаптации: 20-30 минут


ЧТО ЭТО?

Готовая система авторизации для Streamlit приложений с использованием streamlit-authenticator.

Функции:
- Форма логина (логин/пароль)
- Cookie-based сессии
- Защита страниц
- Sidebar с информацией о пользователе
- Кнопка выхода
- Хэширование паролей (bcrypt)


УСТАНОВКА

1. Скопировать в проект

cp -r templates/by-feature/auth/streamlit-auth-v1/* projects/myproject/

2. Установить зависимости

pip install streamlit-authenticator pyyaml

3. Сгенерировать хэши паролей

# Генерация хэша для пароля
python utils/auth_utils.py generate_hash "mypassword"

# Скопировать хэш в config.yaml

4. Обновить config.yaml

credentials:
  usernames:
    admin:
      email: admin@example.com
      name: Admin User
      password: $2b$12$...ваш_хэш...

cookie:
  name: myapp_auth
  key: random_signature_key_12345  # ЗАМЕНИ на случайный ключ!
  expiry_days: 30

Генерация cookie key:

python -c "import secrets; print(secrets.token_urlsafe(32))"

5. Запустить

streamlit run auth_app.py

ИСПОЛЬЗОВАНИЕ

Главная страница с авторизацией

auth_app.py уже содержит всю логику авторизации.

Замени переменные:

APP_NAME = "Мое приложение"  # Название приложения

Защита других страниц

В каждую защищённую страницу добавь:

# pages/01_Dashboard.py
import streamlit as st
from utils.auth_utils import require_auth

# Требовать авторизацию
require_auth()

# Твой контент
st.title("Dashboard")
# ...
from utils.auth_sidebar import setup_sidebar

setup_sidebar("Название страницы")

Получить текущего пользователя

from utils.auth_utils import get_current_user

user = get_current_user()
if user:
    st.write(f"Привет, {user['name']}")

СТРУКТУРА

templates/by-feature/auth/streamlit-auth-v1/
├── README.md              # Этот файл
├── auth_app.py            # Главная страница с авторизацией
├── config.yaml            # Конфигурация пользователей
├── utils/
│   ├── auth_sidebar.py    # Sidebar с logout
│   └── auth_utils.py      # Утилиты (require_auth, generate_hash)
└── template.yaml          # Метаданные

ДОБАВЛЕНИЕ ПОЛЬЗОВАТЕЛЕЙ

Шаг 1: Генерация хэша

python utils/auth_utils.py generate_hash "newpassword"
# Вывод: $2b$12$...хэш...

Шаг 2: Добавить в config.yaml

credentials:
  usernames:
    newuser:
      email: newuser@example.com
      name: New User
      password: $2b$12$...хэш...

Шаг 3: Перезапустить приложение

streamlit run auth_app.py

ЭКОНОМИЯ ТОКЕНОВ

Генерация с нуля: ~4000 tokens
Адаптация шаблона: ~600 tokens
Экономия: 85%


БЕЗОПАСНОСТЬ

⚠️ ВАЖНО:

  1. НЕ коммитить config.yaml с реальными паролями
    bash # Добавить в .gitignore echo "config.yaml" >> .gitignore

  2. Использовать .env для секретов
    python import os cookie_key = os.getenv("COOKIE_KEY", "default_key")

  3. Периодически менять COOKIE_KEY
    - После каждого утечки
    - Раз в 3-6 месяцев

  4. Использовать HTTPS в production

  5. Хранить пароли только в хэшированном виде


ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ

Регистрация новых пользователей

# В auth_app.py добавить
if st.checkbox("Нет аккаунта? Зарегистрируйтесь"):
    try:
        authenticator.register_user(location='main', preauthorization=False)
        if st.session_state.get('register'):
            st.success('Пользователь зарегистрирован успешно')
    except Exception as e:
        st.error(e)

Восстановление пароля

# Забыли пароль
if st.checkbox("Забыли пароль?"):
    try:
        username, email, new_random_password = authenticator.forgot_password('Forgot password')
        if username:
            st.success(f'Новый пароль отправлен на {email}')
            # TODO: Отправить email с new_random_password
        else:
            st.error('Username not found')
    except Exception as e:
        st.error(e)

Смена пароля

# В настройках пользователя
try:
    if authenticator.reset_password(st.session_state["username"], 'Reset password'):
        st.success('Пароль изменён успешно')
except Exception as e:
    st.error(e)

TROUBLESHOOTING

Ошибка "ModuleNotFoundError: No module named 'streamlit_authenticator'"

pip install streamlit-authenticator

Ошибка "FileNotFoundError: config.yaml"

Убедись что config.yaml находится в корне проекта (рядом с auth_app.py).

Пароль не принимается

  1. Проверь что хэш сгенерирован правильно
  2. Проверь что в config.yaml нет лишних пробелов
  3. Перезапусти приложение

Сессия не сохраняется

  1. Проверь COOKIE_KEY в config.yaml
  2. Убедись что браузер принимает cookies
  3. Очисти cookies браузера и попробуй снова

СВЯЗАННЫЕ ШАБЛОНЫ


ПРИМЕРЫ

Минимальный пример

# app.py
import streamlit as st
from utils.auth_utils import require_auth

# Требовать авторизацию
require_auth()

# Контент
st.title("Защищённая страница")
st.write("Только для авторизованных пользователей")

С ролями

# config.yaml добавить роль
credentials:
  usernames:
    admin:
      email: admin@example.com
      name: Admin
      password: $2b$12$...
      role: admin  # Добавить

# В app.py
user = get_current_user()
if user.get('role') == 'admin':
    st.write("Админ-панель")
else:
    st.write("Обычная панель")

Версия: 1.0
Дата: 2025-11-10
Статус: Production ready