|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | # -*- coding: utf-8 -*- |
3 | 3 | import casbin |
4 | | -import casbin_sqlalchemy_adapter |
5 | | - |
| 4 | +import casbin_async_sqlalchemy_adapter |
6 | 5 | from fastapi import Request, Depends |
7 | 6 |
|
8 | 7 | from backend.app.common.exception.errors import AuthorizationError |
9 | 8 | from backend.app.common.jwt import CurrentUser |
10 | 9 | from backend.app.core.conf import settings |
11 | 10 | from backend.app.core.path_conf import RBAC_MODEL_CONF |
| 11 | +from backend.app.database.db_mysql import async_engine |
12 | 12 | from backend.app.models.sys_casbin_rule import CasbinRule |
13 | 13 |
|
14 | 14 |
|
15 | 15 | class RBAC: |
16 | | - def __init__(self): |
17 | | - self._CASBIN_DATABASE_URL = f'mysql+pymysql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_DATABASE}?charset={settings.DB_CHARSET}' |
18 | 16 |
|
19 | | - def get_casbin_enforcer(self) -> casbin.Enforcer: |
| 17 | + @staticmethod |
| 18 | + async def get_casbin_enforcer() -> casbin.Enforcer: |
20 | 19 | """ |
21 | | - 由于 casbin_sqlalchemy_adapter 内部使用的 SQLAlchemy 同步, 这里只能使用: mysql+pymysql |
| 20 | + 获取 casbin 执行器 |
22 | 21 |
|
23 | 22 | :return: |
24 | 23 | """ |
25 | | - # TODO: https://github.com/pycasbin/async-sqlalchemy-adapter/issues/4 |
26 | | - adapter = casbin_sqlalchemy_adapter.Adapter(self._CASBIN_DATABASE_URL, db_class=CasbinRule) |
| 24 | + adapter = casbin_async_sqlalchemy_adapter.Adapter(async_engine, db_class=CasbinRule) |
27 | 25 |
|
28 | 26 | enforcer = casbin.Enforcer(RBAC_MODEL_CONF, adapter) |
29 | 27 |
|
@@ -55,7 +53,7 @@ async def rbac_verify(self, request: Request, user: CurrentUser) -> None: |
55 | 53 | return |
56 | 54 |
|
57 | 55 | # TODO: 通过 redis 做鉴权查询优化,减少数据库查询 |
58 | | - enforcer = self.get_casbin_enforcer() |
| 56 | + enforcer = await self.get_casbin_enforcer() |
59 | 57 | if not enforcer.enforce(user_uuid, path, method): |
60 | 58 | raise AuthorizationError |
61 | 59 |
|
|
0 commit comments