Skip to content

Commit eafd51c

Browse files
committed
feat: 添加复制用户免登录链接动作
1 parent 001bedc commit eafd51c

File tree

5 files changed

+61
-3
lines changed

5 files changed

+61
-3
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
repos:
22
- repo: https://github.com/charliermarsh/ruff-pre-commit
33
# Ruff version.
4-
rev: 'v0.0.279'
4+
rev: 'v0.0.287'
55
hooks:
66
- id: ruff
77
args: [--fix, --exit-non-zero-on-fix]

fastapi_user_auth/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "0.6.1a5"
1+
__version__ = "0.6.1a6"
22
__url__ = "https://github.com/amisadmin/fastapi_user_auth"
33

44
import gettext

fastapi_user_auth/admin/actions.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@
1212
from pydantic import BaseModel
1313
from pydantic.fields import ModelField
1414
from starlette.requests import Request
15+
from starlette.responses import RedirectResponse
1516

1617
from fastapi_user_auth.admin.utils import get_admin_action_options_by_subject
18+
from fastapi_user_auth.auth import Auth
1719
from fastapi_user_auth.auth.models import Role, User
1820
from fastapi_user_auth.auth.schemas import SystemUserEnum
1921
from fastapi_user_auth.mixins.admin import AuthFieldModelAdmin, AuthSelectModelAdmin
22+
from fastapi_user_auth.mixins.models import PkMixin, UsernameMixin
2023
from fastapi_user_auth.utils.casbin import (
2124
get_subject_effect_matrix,
2225
get_subject_page_permissions,
@@ -428,3 +431,55 @@ async def handle(self, request: Request, item_id: List[str], data: BaseModel, **
428431
permissions = [perm for perm in permissions if enforcer.enforce("u:" + identity, *permission_decode(perm))]
429432
await update_subject_page_permissions(enforcer, subject=subject, permissions=permissions) # 更新角色权限
430433
return BaseApiOut(msg="success")
434+
435+
436+
class CopyUserAuthLinkAction(ModelAction):
437+
"""复制用户免登录链接"""
438+
439+
action = amis.ActionType.Dialog(
440+
name="copy_user_auth_link",
441+
icon="fa fa-link",
442+
tooltip="用户免登录链接",
443+
level=amis.LevelEnum.danger,
444+
dialog=amis.Dialog(
445+
size=amis.SizeEnum.md,
446+
title="用户免登录链接",
447+
),
448+
)
449+
form_init = True
450+
form = amis.Form(static=True, disabled=True) # type: ignore # 禁用表单
451+
452+
class schema(UsernameMixin, PkMixin):
453+
auth_url: str = Field(
454+
title="授权链接",
455+
description="复制链接到浏览器打开即可免登录",
456+
amis_form_item=amis.Static(
457+
copyable=True,
458+
),
459+
)
460+
461+
async def get_init_data(self, request: Request, **kwargs) -> BaseApiOut[Any]:
462+
"""复制用户免登录链接"""
463+
item_id = request.query_params.get("item_id")
464+
items = await self.admin.fetch_items(item_id)
465+
user: User = items[0]
466+
auth: Auth = request.auth
467+
token_data = {
468+
"id": user.id,
469+
"username": user.username,
470+
}
471+
token = await auth.backend.token_store.write_token(token_data)
472+
return BaseApiOut(
473+
msg="操作成功",
474+
data={**token_data, "auth_url": f"{str(request.base_url)[:-1]}{self.site.router_path}/login_by_token?token={token}"},
475+
)
476+
477+
def register_router(self):
478+
@self.site.router.get("/login_by_token", include_in_schema=False)
479+
async def login_by_token(token: str):
480+
"""通过url中的token登录"""
481+
response = RedirectResponse(self.site.settings.site_path)
482+
response.set_cookie("Authorization", f"bearer {token}")
483+
return response
484+
485+
return super().register_router()

fastapi_user_auth/admin/admin.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from starlette.routing import NoMatchFound
3838

3939
from fastapi_user_auth.admin.actions import (
40+
CopyUserAuthLinkAction,
4041
UpdateSubDataPermAction,
4142
UpdateSubPagePermsAction,
4243
UpdateSubRolesAction,
@@ -264,6 +265,7 @@ class UserAdmin(AuthFieldModelAdmin, AuthSelectModelAdmin, SoftDeleteModelAdmin,
264265
exclude = ["password"]
265266
ordering = [User.id.desc()]
266267
search_fields = [User.username, UserRoleNameLabel]
268+
update_exclude = AutoTimeModelAdmin.update_exclude | {"username"}
267269
display_item_action_as_column = True
268270
admin_action_maker = [
269271
lambda admin: UpdateSubPagePermsAction(
@@ -279,6 +281,7 @@ class UserAdmin(AuthFieldModelAdmin, AuthSelectModelAdmin, SoftDeleteModelAdmin,
279281
lambda admin: UpdateSubRolesAction(
280282
admin=admin, name="update_subject_roles", tooltip="更新用户角色", icon="fa fa-user", flags="item"
281283
),
284+
lambda admin: CopyUserAuthLinkAction(admin),
282285
]
283286
list_display = [
284287
User.id,

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ classifiers = [
3737
]
3838
dependencies = [
3939
"pydantic>=1.9.0,<2.0.0",
40-
"fastapi-amis-admin>=0.6.5a1,<0.7.0",
40+
"fastapi-amis-admin>=0.6.5a2,<0.7.0",
4141
"email-validator>=1.3.1,<2.0.0",
4242
"passlib>=1.7.4",
4343
"bcrypt>=4.0.0",

0 commit comments

Comments
 (0)