|
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