Skip to content

sqladmin админка#251

Open
petrCher wants to merge 13 commits intomainfrom
petr-sqladmin
Open

sqladmin админка#251
petrCher wants to merge 13 commits intomainfrom
petr-sqladmin

Conversation

@petrCher
Copy link
Copy Markdown
Member

@petrCher petrCher commented May 9, 2026

Изменения

Добавлена sqladmin-админка для управления скоупами, группами и пользователями(только работа с группами для пользователей)

Детали реализации

Для аутентификации в админке используется AdminAuth с логином и паролем из .env (ADMIN_LOGIN, ADMIN_PASSWORD, ADMIN_SECRET_KEY).
Логика изменения групп у пользователя и CRUD-операций над группами вынесена в отдельные функции (patch_user_groups, create_group_logic, patch_group_logic, delete_group_id) и используется как эндпоинтах, так и в админке.
Для работы с soft delete переопределены методы update_model, delete_model, insert_model.
Удалённые записи скрыты из списков через list_query и count_query, а из форм — через FilteredModelConverter.

Проблемы, которые присутствуют в текущей версии:

не знаю как получать user_id из UnionAuth для создания скоупа
не уверен, что текущая версия авторизации в админке является корректной
вероятно надо добавить не только возможность работы с управлением скоупами, но и все, что есть в аутхе(может возникнуть проблема с полным доступом ко всем данным аута и возможностью делать с ними что угодно)

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

💩 Code linting failed, use black and isort to fix it.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

Code Coverage

Coverage Report
FileStmtsMissCoverMissing
auth_backend
   __main__.py330%1–5
   base.py12467%6–9
   exceptions.py45687%32, 50–52, 57, 78
auth_backend/admin
   admin.py873164%32, 35, 38–42, 45–47, 71, 74, 77–82, 85–93, 96–97, 120, 123, 126–129
   auth.py191142%12–18, 21–22, 25–26
   filter.py171135%13–24
auth_backend/auth_method
   base.py63494%52, 54, 61, 143
   method_mixins.py32294%27, 50
   oauth.py561770%38, 44, 49–54, 58–69, 95–100
   outer.py1142975%27, 34, 41, 48, 99, 105, 114, 168–173, 186–194, 206–212
   userdata_mixin.py19574%32, 37–40
auth_backend/auth_plugins
   airflow.py331652%26–37, 42–65
   authentic.py19010346%53–65, 70–83, 87–102, 106–112, 116–122, 129–131, 141–197, 204–254, 259, 264–265, 275–282, 311–317, 326, 331–341, 346–359
   coder.py321650%25–34, 39–52
   email.py2551495%91, 248, 333, 335, 340, 351–357, 404, 445, 496, 506
   github.py1046339%57–116, 130–174, 184, 189, 195–207
   google.py1126443%65–124, 138–166, 176, 182–186, 190–195, 199–208
   keycloak.py1046240%53–115, 125–175, 185, 190, 196–201
   lkmsu.py16411232%60–113, 131–169, 179–201, 206, 211, 217–227, 231–245, 249–278, 282–291
   mailu.py341847%25–34, 39–54
   postgres.py432053%29–35, 40–46, 51–63
   telegram.py1035448%58–85, 100–118, 131, 139, 147–167, 172–186
   vk.py1288236%71–123, 137–175, 185, 190, 196–213, 220–246
   yandex.py1278335%58–128, 141–179, 190, 196, 202–228
auth_backend/cli
   group.py13130%1–17
   process.py56560%1–72
   scope.py11110%1–20
   user.py20200%1–40
   user_group.py12120%1–25
auth_backend/kafka
   kafka.py502060%30–33, 42–44, 56–59, 72–82, 85, 93, 103
   kafkameta.py9278%8, 12
auth_backend/models
   base.py83594%79, 100–102, 106
   db.py152895%47, 56, 60, 121, 215, 224, 228, 241
   dynamic_settings.py27774%24–31
auth_backend/routes
   base.py37295%25–26
   exc_handlers.py43686%31, 56, 69, 95, 117, 125
   groups.py92397%82, 149, 151
   oidc.py34197%94
   scopes.py36392%24, 53–54
   user.py972772%53, 55, 57–66, 72–78, 90–110, 163, 173
   user_session.py84693%80–89, 119, 121, 182, 189
auth_backend/schemas
   models.py100397%150–152
auth_backend/schemas/types
   scopes.py24675%30–32, 37, 40, 42
auth_backend/utils
   jwt.py57788%35–42
   oidc_token.py37878%26, 39–43, 48, 74
   security.py46296%41, 66
   smtp.py771877%76–79, 101–120
   string.py7186%12
   user_session_control.py41295%33, 41
TOTAL3268107967% 

Summary

Tests Skipped Failures Errors Time
72 6 💤 0 ❌ 0 🔥 12.702s ⏱️

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 9, 2026

💩 Code linting failed, use black and isort to fix it.

@petrCher petrCher linked an issue May 10, 2026 that may be closed by this pull request
@petrCher
Copy link
Copy Markdown
Member Author

Снимок экрана 2026-05-11 в 00 12 13 Снимок экрана 2026-05-11 в 00 12 27 Снимок экрана 2026-05-11 в 00 12 21

@petrCher
Copy link
Copy Markdown
Member Author

выше скрины как выглядит админка

@petrCher petrCher requested a review from Temmmmmo May 10, 2026 21:24
@petrCher petrCher self-assigned this May 10, 2026
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А как эти изменения относятся к админ-панели ?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я использовал для работы с админкой тот же код при создании/изменении/удалении, не хотел одно и то же два раза писать, тем более если поменяем логику в них где-то, не потребуется в двух местах менять

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

если что, я ничего не менял, только вынес логику в отдельные функции

Comment on lines +10 to +26
class AdminAuth(AuthenticationBackend):
async def login(self, request: Request) -> bool:
form = await request.form()
username = form.get("username")
password = form.get("password")
if username == settings.ADMIN_LOGIN and password == settings.ADMIN_PASSWORD:
request.session["user"] = username
return True
return False

async def logout(self, request: Request) -> bool:
request.session.clear()
return True

async def authenticate(self, request: Request) -> bool:
user = request.session.get("user")
return user is not None
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не, так не пойдет. Надо использовать наш аутх и завязать методы login и authenticate на наши внутренние скоупы.

  1. Можно передавать токен наш в форму авторизации sqladmin как-то, сделая кастомную форму (с нейронкой мне кажется изи делается)
  2. Брать наш токен из локал стораджа, но хз, распространяется ли локалсторадж куда-то дальше app.profcomff.com

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ок, подумаю как сделать, тогда вероятно и проблема выше с UnionAuth уйдет

Comment thread auth_backend/admin/filter.py
Comment thread auth_backend/settings.py Outdated
KAFKA_TIMEOUT: int = 2
KAFKA_LOGIN: str | None = None
KAFKA_PASSWORD: str | None = None
ADMIN_SECRET_KEY: str | None = None
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

После мерджа все упадет на том, что в админку не проставится secret key, поэтому тут лучше сделать его либо обязательным:

ADMIN_SECRET_KEY: str

Либо проставить какой-то дефолт

ADMIN_SECRET_KEY: str = "default"

Comment thread auth_backend/admin/filter.py
Comment thread .github/workflows/checks.yml Outdated
column_sortable_list = ["id", "name"]
column_default_sort = [("id", False)]
form_excluded_columns = ["create_ts", "update_ts", "groups", "user_sessions", "is_deleted"]
can_create = False # I don't know how to use UnionAuth there to get user_id that is required
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Такая ситуация: для создания скоупа необходимо получать creator_id, который получается из UnionAuth, но так как пока что не знаю как его привязать, то и передавать айдишник пользователя не могу

Comment thread requirements.dev.txt Outdated
@morozov-tech morozov-tech requested a review from Zimovchik May 11, 2026 10:15
@petrCher petrCher added the new feature 🆕 Новая фича или запрос на нее label May 11, 2026
@github-actions
Copy link
Copy Markdown

💩 Code linting failed, use black and isort to fix it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new feature 🆕 Новая фича или запрос на нее

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Сделать sqladmin админку выдачи скоупов

2 participants