Skip to content

Commit 8829c62

Browse files
committed
修复创建多对多的问题
取消用户直接绑定权限
1 parent 0f82081 commit 8829c62

File tree

12 files changed

+122
-134
lines changed

12 files changed

+122
-134
lines changed

fast_tmp/admin/depends.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,14 @@ async def __get_user_or_none(access_token: Optional[str] = Cookie(None)) -> Opti
4848
return None
4949
except Exception:
5050
return None
51-
user = await User.filter(username=username).first()
52-
if user is not None and user.is_active:
53-
return user
51+
return await User.filter(username=username).first()
5452
return None
5553

5654

57-
async def get_user(request: Request, user: Optional[User] = Depends(__get_user_or_none)):
55+
async def get_staff(request: Request, user: Optional[User] = Depends(__get_user_or_none)):
5856
"""
5957
found user and write to request
6058
"""
61-
if not user or not user.is_active:
59+
if not user or not user.is_active or not user.is_staff:
6260
raise NoAuthError()
6361
request.scope["user"] = user

fast_tmp/admin/endpoint.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
from fastapi import APIRouter, Depends
44
from starlette.requests import Request
55

6-
from fast_tmp.admin.depends import get_user
6+
from fast_tmp.admin.depends import get_staff
77
from fast_tmp.responses import BaseRes, ListDataWithPage
88
from fast_tmp.site import ModelAdmin, get_model_site
99

1010
router = APIRouter()
1111

1212

13-
@router.get("/{resource}/list", dependencies=[Depends(get_user)])
13+
@router.get("/{resource}/list", dependencies=[Depends(get_staff)])
1414
async def list_view(
1515
request: Request,
1616
page_model: ModelAdmin = Depends(get_model_site),
@@ -26,7 +26,7 @@ async def list_view(
2626
)
2727

2828

29-
@router.get("/{resource}/prefetch/{field_name}", dependencies=[Depends(get_user)])
29+
@router.get("/{resource}/prefetch/{field_name}", dependencies=[Depends(get_staff)])
3030
async def prefetch_view(
3131
request: Request,
3232
field_name: str,
@@ -42,7 +42,7 @@ async def prefetch_view(
4242
return BaseRes(data=datas)
4343

4444

45-
@router.get("/{resource}/select/{field_name}", dependencies=[Depends(get_user)])
45+
@router.get("/{resource}/select/{field_name}", dependencies=[Depends(get_staff)])
4646
async def select_view(
4747
request: Request,
4848
field_name: str,
@@ -58,7 +58,7 @@ async def select_view(
5858
return BaseRes(data=datas)
5959

6060

61-
@router.post("/{resource}/patch/{pk}", dependencies=[Depends(get_user)])
61+
@router.post("/{resource}/patch/{pk}", dependencies=[Depends(get_staff)])
6262
async def patch_data(
6363
request: Request,
6464
pk: str,
@@ -72,7 +72,7 @@ async def patch_data(
7272
return BaseRes().dict()
7373

7474

75-
@router.put("/{resource}/update/{pk}", dependencies=[Depends(get_user)])
75+
@router.put("/{resource}/update/{pk}", dependencies=[Depends(get_staff)])
7676
async def update_data(
7777
request: Request,
7878
pk: str,
@@ -83,7 +83,7 @@ async def update_data(
8383
return BaseRes(data=data)
8484

8585

86-
@router.get("/{resource}/update/{pk}", dependencies=[Depends(get_user)])
86+
@router.get("/{resource}/update/{pk}", dependencies=[Depends(get_staff)])
8787
async def update_view(
8888
request: Request,
8989
pk: str,
@@ -93,7 +93,7 @@ async def update_view(
9393
return BaseRes(data=data)
9494

9595

96-
@router.post("/{resource}/create", dependencies=[Depends(get_user)])
96+
@router.post("/{resource}/create", dependencies=[Depends(get_staff)])
9797
async def create(
9898
request: Request,
9999
page_model: ModelAdmin = Depends(get_model_site),
@@ -103,7 +103,7 @@ async def create(
103103
return BaseRes(data=data)
104104

105105

106-
@router.delete("/{resource}/delete/{pk}", dependencies=[Depends(get_user)])
106+
@router.delete("/{resource}/delete/{pk}", dependencies=[Depends(get_staff)])
107107
async def delete_func(
108108
request: Request,
109109
pk: str,
@@ -113,9 +113,9 @@ async def delete_func(
113113
return BaseRes()
114114

115115

116-
@router.get("/{resource}/schema", dependencies=[Depends(get_user)])
116+
@router.get("/{resource}/schema", dependencies=[Depends(get_staff)])
117117
async def get_schema(
118118
request: Request,
119119
page: ModelAdmin = Depends(get_model_site),
120120
):
121-
return BaseRes(data=page.get_app_page(request))
121+
return BaseRes(data=await page.get_app_page(request))

fast_tmp/admin/server.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
from fast_tmp.admin.site import GroupAdmin, UserAdmin
1212
from fast_tmp.conf import settings
13-
from fast_tmp.models import User
13+
from fast_tmp.models import Permission, User
1414
from fast_tmp.responses import BaseRes, FastTmpError
1515
from fast_tmp.site import model_list, register_model_site
1616
from fast_tmp.utils.token import create_access_token
1717

1818
from ..jinja_extension.tags import register_tags
19-
from .depends import get_user
19+
from .depends import get_staff
2020
from .endpoint import router
2121
from .exception_handlers import fasttmp_exception_handler, tortoise_exception_handler
2222

@@ -31,8 +31,8 @@
3131
admin.exception_handler(BaseORMException)(tortoise_exception_handler)
3232

3333

34-
@admin.post("/", name="index", dependencies=[Depends(get_user)])
35-
@admin.get("/", name="index", dependencies=[Depends(get_user)])
34+
@admin.post("/", name="index", dependencies=[Depends(get_staff)])
35+
@admin.get("/", name="index", dependencies=[Depends(get_staff)])
3636
async def index(request: Request):
3737
return templates.TemplateResponse(
3838
"index.html",
@@ -99,10 +99,24 @@ def logout(request: Request):
9999
return res
100100

101101

102-
@admin.get("/site", dependencies=[Depends(get_user)])
103-
def get_site(request: Request):
102+
@admin.get("/site", dependencies=[Depends(get_staff)])
103+
async def get_site(request: Request):
104104
pages = []
105+
user = request.user
106+
if not user.is_superuser:
107+
perms = [
108+
i.codename
109+
for i in await Permission.filter(groups__user=user, codename__endswith="list")
110+
]
111+
else:
112+
perms = [i.codename for i in await Permission.filter(codename__endswith="list")]
105113
for name, ml in model_list.items(): # todo add home page
114+
ml_p = []
115+
for model in ml:
116+
if model.name + "_list" in perms:
117+
ml_p.append(model)
118+
if len(ml_p) == 0:
119+
continue
106120
pages.append( # todo 增加权限控制,确认对应的页面
107121
{
108122
"label": name,

fast_tmp/admin/site.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
from typing import Any, Dict
2-
3-
from requests import Request
4-
from tortoise import Model
5-
61
from fast_tmp.models import Group, Permission, User
72
from fast_tmp.site import ModelAdmin
83
from fast_tmp.site.field import Password
@@ -17,7 +12,6 @@ class UserAdmin(ModelAdmin):
1712
"password",
1813
"name",
1914
"groups",
20-
"permissions",
2115
"is_active",
2216
"is_superuser",
2317
"is_staff",
@@ -27,12 +21,11 @@ class UserAdmin(ModelAdmin):
2721
"password",
2822
"name",
2923
"groups",
30-
"permissions",
3124
"is_active",
3225
"is_superuser",
3326
"is_staff",
3427
)
35-
fields = {"password": Password}
28+
fields = {"password": Password} # type: ignore
3629

3730

3831
class GroupAdmin(ModelAdmin):
@@ -44,6 +37,6 @@ class GroupAdmin(ModelAdmin):
4437

4538
class PermissionAdmin(ModelAdmin):
4639
model = Permission
47-
list_display = ("label", "codename", "users", "groups")
48-
create_fields = ("label", "codename", "users", "groups")
49-
update_fields = ("label", "codename", "users", "groups")
40+
list_display = ("label", "codename", "groups")
41+
create_fields = ("label", "codename", "groups")
42+
update_fields = ("label", "codename", "groups")

fast_tmp/conf/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def _init_model(self):
7474

7575
warnings.warn("TORTOISE_ORM为空")
7676
else:
77-
init_model(self)
77+
init_model(self) # fixme 如果提示 has no models,请检查是否在执行导入settings之前先导入了fast_tmp.model
7878

7979

8080
settings = Settings()

fast_tmp/depends/auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import timedelta
2-
from typing import Optional, Tuple
2+
from typing import List, Optional
33

44
from fastapi import Depends, FastAPI, HTTPException, status
55
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
@@ -121,7 +121,7 @@ async def get_superuser(current_user: User = Depends(get_current_active_user)):
121121
return current_user
122122

123123

124-
async def get_user_has_perms(perms: Optional[Tuple[str, ...]]):
124+
async def get_user_has_perms(perms: Optional[List[str]]):
125125
"""
126126
判定用户是否具有相关权限
127127
"""

fast_tmp/models.py

Lines changed: 19 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,12 @@
1-
from typing import Tuple
1+
from typing import List
22

33
from tortoise import Model, fields
44

5-
from fast_tmp.conf import settings
6-
from fast_tmp.contrib.auth.hashers import check_password, make_password
7-
85

96
class Permission(Model):
107
label = fields.CharField(max_length=128)
118
codename = fields.CharField(max_length=128, unique=True)
129
groups: fields.ManyToManyRelation["Group"]
13-
users: fields.ManyToManyRelation["User"]
14-
15-
# @classmethod
16-
# def make_permission(
17-
# cls,
18-
# model: Type[BaseModel],
19-
# ):
20-
# """
21-
# 生成model对应的权限
22-
# """
23-
# model_name = model.__name__
24-
# Permission.get_or_create(
25-
# defaults={
26-
# "label": "can read " + model_name,
27-
# "model": model_name,
28-
# "codename": "can_read_" + model_name,
29-
# }
30-
# )
31-
# Permission.get_or_create(
32-
# defaults={
33-
# "label": "can create " + model_name,
34-
# "model": model_name,
35-
# "codename": "can_create_" + model_name,
36-
# }
37-
# )
38-
# Permission.get_or_create(
39-
# defaults={
40-
# "label": "can update " + model_name,
41-
# "model": model_name,
42-
# "codename": "can_update_" + model_name,
43-
# }
44-
# )
45-
# Permission.get_or_create(
46-
# defaults={
47-
# "label": "can delete " + model_name,
48-
# "model": model_name,
49-
# "codename": "can_delete_" + model_name,
50-
# }
51-
# )
5210

5311
def __eq__(self, other) -> bool:
5412
if other == self.codename or getattr(other, "codename", None) == self.codename:
@@ -67,58 +25,53 @@ class User(Model):
6725
password = fields.CharField(max_length=255)
6826
name = fields.CharField(max_length=128)
6927
is_active = fields.BooleanField(default=True)
70-
is_staff = fields.BooleanField(default=False) # todo 为true才可以访问后台
28+
is_staff = fields.BooleanField(default=False)
7129
is_superuser = fields.BooleanField(default=False)
7230
groups: fields.ManyToManyRelation["Group"]
73-
permissions: fields.ManyToManyRelation[Permission] = fields.ManyToManyField(
74-
"fast_tmp.Permission", related_name="users"
75-
)
7631

77-
class Meta:
78-
abstract = settings.AUTH_USER_MODEL_NAME != "User"
32+
# class Meta:
33+
# abstract = settings.AUTH_USER_MODEL_NAME != "User"
7934

8035
def set_password(self, raw_password: str):
8136
"""
8237
设置密码
8338
"""
39+
from fast_tmp.contrib.auth.hashers import make_password
8440

8541
self.password = make_password(raw_password)
8642

8743
def check_password(self, raw_password: str) -> bool:
8844
"""
8945
验证密码
9046
"""
47+
from fast_tmp.contrib.auth.hashers import check_password
48+
9149
return check_password(raw_password, self.password)
9250

9351
async def has_perm(self, codename: str) -> bool:
9452
"""
9553
判定用户是否有权限
9654
"""
97-
if self.is_superuser:
55+
if self.is_superuser and self.is_active:
9856
return True
99-
if (
100-
await Permission.filter(users__pk=self.pk).filter(codename=codename).exists()
101-
or await Permission.filter(groups__users__pk=self.pk).filter(codename=codename).exists()
102-
):
57+
if await Group.filter(users__pk=self.pk, permissions__codename=codename).exists():
10358
return True
10459
return False
10560

106-
async def has_perms(self, codenames: Tuple[str, ...]) -> bool:
61+
async def has_perms(self, codenames: List[str]) -> bool:
10762
"""
10863
根据permission的codename进行判定
10964
"""
65+
perms = await self.get_perms(codenames)
66+
return len(perms) == codenames
67+
68+
async def get_perms(self, codenames: List[str]) -> List[str]:
11069
if self.is_superuser:
111-
return True
112-
perms1 = await Permission.filter(users__pk=self.pk)
113-
perms2 = await Permission.filter(groups__users__pk=self.pk)
114-
s = set([i.codename for i in perms2])
115-
for i in perms1:
116-
s.add(i.codename)
117-
118-
for codename in codenames:
119-
if not (codename in s):
120-
return False
121-
return True
70+
return codenames
71+
perms = await Permission.filter(
72+
groups__users__pk=self.pk, permissions__codename__in=codenames
73+
)
74+
return [i.codename for i in perms]
12275

12376
def __str__(self):
12477
return self.name

0 commit comments

Comments
 (0)