ID: streamlit-auth-v1
Категория: auth
Фреймворк: Streamlit
Сложность: Medium
Время адаптации: 20-30 минут
Готовая система авторизации для Streamlit приложений с использованием streamlit-authenticator.
Функции:
- Форма логина (логин/пароль)
- Cookie-based сессии
- Защита страниц
- Sidebar с информацией о пользователе
- Кнопка выхода
- Хэширование паролей (bcrypt)
cp -r templates/by-feature/auth/streamlit-auth-v1/* projects/myproject/
pip install streamlit-authenticator pyyaml
# Генерация хэша для пароля
python utils/auth_utils.py generate_hash "mypassword"
# Скопировать хэш в 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))"
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 # Метаданные
python utils/auth_utils.py generate_hash "newpassword"
# Вывод: $2b$12$...хэш...
credentials:
usernames:
newuser:
email: newuser@example.com
name: New User
password: $2b$12$...хэш...
streamlit run auth_app.py
Генерация с нуля: ~4000 tokens
Адаптация шаблона: ~600 tokens
Экономия: 85%
НЕ коммитить config.yaml с реальными паролями
bash
# Добавить в .gitignore
echo "config.yaml" >> .gitignore
Использовать .env для секретов
python
import os
cookie_key = os.getenv("COOKIE_KEY", "default_key")
Периодически менять COOKIE_KEY
- После каждого утечки
- Раз в 3-6 месяцев
Использовать HTTPS в production
Хранить пароли только в хэшированном виде
# В 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)
pip install streamlit-authenticator
Убедись что config.yaml находится в корне проекта (рядом с auth_app.py).
# 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