Skip to content

Commit c361789

Browse files
committed
fix: 修复AuthSelectModelAdmin权限校验逻辑
1 parent ef69c65 commit c361789

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

fastapi_user_auth/mixins/admin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,10 +271,15 @@ async def has_select_permission(self, request: Request, name: str) -> bool:
271271

272272
async def get_select(self, request: Request) -> Select:
273273
sel = await super().get_select(request)
274+
subject = await self.site.auth.get_current_user_identity(request)
275+
if subject == SystemUserEnum.ROOT:
276+
return sel
274277
for permission in self.select_permissions:
278+
if not isinstance(permission, SelectPerm):
279+
continue
275280
effect = await self.has_select_permission(request, permission.name)
276281
# 如果权限为反向权限,则判断用户是否没有权限
277-
if effect or (permission.reverse and not effect):
282+
if permission.reverse ^ effect:
278283
sel = permission.call(self, request, sel)
279284
if asyncio.iscoroutine(sel):
280285
sel = await sel

fastapi_user_auth/mixins/schemas.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class SelectPerm:
2828
call: SelectPermCallable = None
2929

3030
def __post_init__(self):
31+
if self.call is None and hasattr(self, "_call"):
32+
self.call = self._call
3133
assert self.call is not None, "call must be set"
3234

3335

@@ -42,7 +44,7 @@ def __post_init__(self):
4244
# 如果td为int,则表示秒数
4345
self.td = timedelta(seconds=self.td) if isinstance(self.td, int) else self.td
4446

45-
async def call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
47+
async def _call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
4648
column = getattr(admin.model, self.time_column)
4749
return sel.where(column > datetime.now() - self.td)
4850

@@ -53,7 +55,7 @@ class UserSelectPerm(SelectPerm):
5355

5456
user_column: str = "user_id"
5557

56-
async def call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
58+
async def _call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
5759
user_id = await admin.site.auth.get_current_user_identity(request, name="id")
5860
if not user_id: # 未登录
5961
return sel.where(False)
@@ -68,7 +70,7 @@ class SimpleSelectPerm(SelectPerm):
6870
values: Union[List[str], List[int]] = None
6971
column: str = "status"
7072

71-
async def call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
73+
async def _call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
7274
if not self.values:
7375
return sel
7476
column = getattr(admin.model, self.column)
@@ -83,7 +85,7 @@ class FilterSelectPerm(SelectPerm):
8385

8486
filters: list = None
8587

86-
async def call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
88+
async def _call(self, admin: ModelAdmin, request: Request, sel: Select) -> Select:
8789
if not self.filters:
8890
return sel
8991
return sel.filter(*self.filters)

0 commit comments

Comments
 (0)