Система управления пользователями и правами доступа
- Описание проекта
Данный проект реализует систему управления пользователями с возможностью:
Регистрации новых пользователей
Авторизации (login) и выхода из системы (logout)
Обновления информации о пользователе
Мягкого удаления аккаунта (аккаунт становится неактивным)
Управления токенами доступа (JWT) и обновления токенов
Ограничения доступа к ресурсам по ролям
Технологии: FastAPI, SQLAlchemy, PostgreSQL / SQLite, JWT, Passlib (bcrypt).
- Модель данных Таблица users Поле Тип Описание id int Уникальный идентификатор first_name str Имя пользователя last_name str Фамилия пользователя email str Email (уникальный) password str Хэш пароля is_active bool Статус аккаунта (True — активен, False — удален) role str Роль пользователя (по умолчанию 'user') Таблица refresh_tokens Поле Тип Описание id int Уникальный идентификатор user_id int Идентификатор пользователя token str Токен обновления (refresh token) expires_at datetime Дата и время истечения токена
- Система ролей и прав доступа
Роли пользователей:
Роль Доступные действия user Просмотр своего профиля (/me), обновление своего профиля (/users_update/) admin Все действия пользователя + просмотр всех пользователей (/users/), удаление и обновление любых пользователей
Принцип ограничения доступа:
Если токен невалидный → возвращается 401 Unauthorized
Если токен валидный, но у пользователя нет права на действие → возвращается 403 Forbidden
Проверка роли и прав осуществляется на уровне эндпоинтов и зависимостей FastAPI (Depends(get_current_token) + проверка роли)
- Эндпоинты API Регистрация
POST /create_user/
Параметры: first_name, last_name, email, password, last_password
Проверяет корректность пароля и уникальность email
Возвращает данные созданного пользователя (без пароля)
Авторизация
POST /login/
Параметры: email, password
Возвращает: access_token (JWT), refresh_token, token_type
Обновление токена
POST /restart_access_token/
Параметры: refresh_token
Возвращает новый access_token и refresh_token
Просмотр пользователя
GET /users/{user_id} — доступен только для авторизованных
GET /users/ — для администратора, возвращает список всех пользователей
GET /me/ — возвращает профиль текущего пользователя
Обновление пользователя
PUT /users_update/
Пользователь может обновить только свой профиль
Админ может обновлять любые профили (при расширении функционала)
Удаление пользователя (мягкое)
DELETE /users/{user_id}
Аккаунт становится is_active=False
Удаляются все refresh токены
Пользователь не может войти повторно
Выход из системы
POST /logout/
Удаляет все refresh токены пользователя
- Проверка уникальности email при обновлении
При обновлении профиля проверяется, чтобы новый email не совпадал с email других пользователей:
email_exists = db.query(User).filter(User.email == new_email, User.id != current_user.id).first() if email_exists: raise HTTPException(status_code=400, detail="Email уже используется")
Таким образом, пользователь не может «переписать» чужой email.
- Работа с JWT
Access Token: срок жизни 15 минут
Refresh Token: срок жизни 7 дней
При logout или удалении аккаунта все refresh токены удаляются
После logout пользователь не сможет обновлять access token