免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Flet 用户认证数据模型解析:深入理解 flet.auth.User 与用户资料结构

Flet 用户认证数据模型解析:深入理解 flet.auth.User 与用户资料结构 前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载导读flet.auth.User是 Flet 官方文档中「类型Types」参考体系下auth命名空间的核心类型之一承载着 OAuth 登录流程结束后当前登录用户是谁这一关键信息。本文以 website/docs/types/auth/user.md 文档页为骨架结合仓库中flet.auth模块的真实源码为你讲透User类的设计动机、成员语义、与Group的关联以及在 授权服务 中它被填充的完整生命周期。读完本文你将能准确使用page.auth.user读取用户标识、自定义字段与用户组并理解fetch_user/fetch_groups这些开关对User对象内容的影响。一、这份文档页是什么一个由源码驱动的 API 引用页website/docs/types/auth/user.md本身非常精简正文核心只有一行 JSX 组件调用--- title: User --- import {ClassAll} from site/src/components/crocodocs; ClassAll nameflet.auth.User /这并非内容缺失而是 Flet 文档站的一种工程化做法页面通过 ClassAll.js 组件从站点的 API 数据crocodocs 组件体系从api-data中按全限定名flet.auth.User查表自动渲染出该类的完整参考信息包括类级 docstring 与Inherits继承关系Properties / Events / Methods 三段的成员摘要与详情每个成员带复制签名按钮的签名框与逐项说明。渲染逻辑集中在 ClassBlock.js它负责按properties、events、methods分组渲染成员并把成员条目注入 Docusaurus 侧边目录。因此该文档页的真实内容源就是flet.auth.User的 Python 实现——也就是接下来我们要剖析的主体。二、flet.auth.User的核心设计字典子类 规范化属性User的实现位于 sdk/python/packages/flet/src/flet/auth/user.pyclass User(dict): Authenticated user profile used by Flet authorization flows. The instance is a mutable mapping with provider-specific user fields and normalized attributes such as :attr:id and :attr:groups. Args: kwargs: Provider-specific user fields to store in the mapping. id: Stable user identifier. 设计上有两个并行的信息通道这是理解User的关键映射通道dict 子类User直接继承内置dict。构造函数把kwargs全部展开存入字典因此不同 OAuth 服务商返回的原始用户字段例如 GitHub 的login、avatar_urlGoogle 的email、picture会被原样保留在键值对中你可以用user[login]或user.get(email)这样的字典方式访问任意 provider 特有字段无需 Flet 预先枚举字段名。规范化属性通道实例属性id与groups是 Flet 抽象出的、与具体服务商无关的稳定接口保证应用层代码可以用统一的方式拿用户 ID和用户组。构造函数本身非常直白def __init__(self, kwargs: dict[str, Any], id: str) - None: super().__init__(kwargs) self.id id self.groups []即把 provider 字段灌入字典设置规范化id并将groups初始化为空列表组信息需要额外拉取见下文。三、两个规范化成员id与groups1.id稳定的用户标识id: str Provider user identifier represented as a string. 类型固定为str即使用户 ID 在服务商侧是整数如 GitHub 的数字 user idFlet 也会按字符串语义提供避免应用层做类型分支。它来自 provider 的user_id_fn或各内置 provider 的_fetch_user实现是判断当前用户是谁、是否已登录的第一依据。2.groups用户组 / 角色集合groups: list[Group] Groups loaded for this user when group retrieval is enabled. 类型为list[Group]默认[]。docstring 中when group retrieval is enabled明确限定了它的填充前提只有在认证服务开启fetch_groups时才会被真正加载否则保持空列表。3. 关联类型flet.auth.Groupgroups的元素类型是同一命名空间下的 Group源码见 sdk/python/packages/flet/src/flet/auth/group.py其设计与User完全对称class Group(dict): Group or role entry associated with an authenticated :class:~flet.auth.User. ... Args: kwargs: Provider-specific group fields to store in the mapping. name: Group name used for display and matching. def __init__(self, kwargs: dict[str, Any], name: str) - None: super().__init__(kwargs) self.name name即每个Group同样是一个可变映射保存服务商返回的组元数据如 GitHub 组织的login、id同时暴露规范化的name人类可读的组名。应用逻辑中常见的判断用户是否属于某角色/组织就直接对比group.name。值得注意user.py顶部对Group使用了TYPE_CHECKING下的延迟导入运行时并不强制依赖Group模块存在进一步说明groups是可选增强能力而非登录必需项。四、User在认证流程中的完整生命周期User不是由应用手动new出来的而是由 AuthorizationService 在 OAuth 流程的特定阶段自动构造并填充。AuthorizationService的__init__中维护了self.user: Optional[User] None见该文件第 46 行User的诞生集中在私有方法__fetch_user_and_groups第 143-166 行async def __fetch_user_and_groups(self): assert self.__token is not None if self.fetch_user: self.user await self.provider._fetch_user(self.__token.access_token) if self.user is None and self.provider.user_endpoint is not None: if self.provider.user_id_fn is None: raise ValueError( user_id_fn must be specified too if user_endpoint is not None ) self.user await self.__get_user() if self.fetch_groups and self.user is not None: self.user.groups await self.provider._fetch_groups( self.__token.access_token )这段逻辑揭示了User的三个重要事实用户信息来自 provider 的用户接口优先调用 provider 实现的_fetch_user(access_token)GitHub / Google / Auth0 / Azure 四个内置 provider 均实现于 providers 目录若返回None且配置了user_endpoint则回退到通用端点拉取此时必须同时提供user_id_fn否则抛出ValueError。groups是追加填充的self.user.groups ...直接覆写User实例的groups属性与__init__中初始化的空列表衔接印证了启用组拉取才非空的语义。受两个开关控制fetch_user与fetch_groups第 41-42 行不仅决定是否拉取还会在__init__中把provider.user_scopes/provider.group_scopes合并进最终 OAuth scope 列表第 48-57 行——也就是说权限范围、返回内容、User对象内容三者由同一组配置联动。User的另外两个出现时机dehydrate_token第 59-73 行从持久化 token 恢复会话后会先刷新 token再调用__fetch_user_and_groups重建Userrequest_token第 109-141 行用授权码换到 access token 后同样会走__fetch_user_and_groups。因此无论首次登录还是会话恢复只要fetch_userTruepage.auth.user就始终是一个填充完毕的User实例。五、实战如何读取和使用UserFlet 应用通常在登录回调中获取User对象。以下模式基于上述源码语义可直接用于你的应用import flet as ft def on_login(e): user e.page.auth.user # Optional[User] if user is None: print(未登录) return # 1) 规范化属性稳定标识与用户组 print(用户 ID:, user.id) for g in user.groups: # 需 fetch_groupsTrue 才有内容 print(组名:, g.name) # 2) 字典通道访问服务商原始字段 print(登录名:, user.get(login) or user.get(email)) print(头像:, user.get(avatar_url) or user.get(picture)) def main(page: ft.Page): page.on_login on_login page.add(ft.ElevatedButton(登录, on_clicklambda e: page.login(ft.GitHubOAuthProvider(client_id...)))) ft.app(main)要点回顾user.id与user.groups[i].name是与具体 OAuth 服务商解耦的稳定 API适合写进业务逻辑user[...]/user.get(...)适合透传服务商特有字段字段名随 provider 而异groups是否为空取决于AuthorizationService(fetch_groups...)的配置判断角色前请确认已启用组拉取并申请了对应 scope。六、延伸阅读类型参考user.md、group.md、authorizationservice.md、authorization.md、oauthtoken.md源码实现user.py、group.py、authorization_service.py、oauth_provider.py内置服务商providersGitHub、Google、Auth0、Azure实战指南website/docs/cookbook/authentication.md赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐BongoCat桌面互动宠物让键盘鼠标操作变得生动有趣的虚拟猫咪伴侣BongoCat桌面互动宠物让键盘鼠标操作变得生动有趣的虚拟猫咪伴侣 厌倦了单调的键盘敲击和鼠标点击BongoCat是一款创新的跨平台桌面互动宠物应用通过桌面应用深入解析 cockpit-tlsCockpit 的 TLS 终结代理与客户端证书认证架构深入解析 cockpit tlsCockpit 的 TLS 终结代理与客户端证书认证架构 Cockpit 在服务器上以 Web 图形界面提供管理能力而 co后端运维Wasp 用户名与密码认证解读 identities.username 的数据结构、存储模型与读取实践Wasp 用户名与密码认证解读 identities.username 的数据结构、存储模型与读取实践 本篇技术指南围绕 Wasp 0.17 版本文档中的用户Web框架后端前端CLI开发工具上一篇告别终端交互难题用gh_mirrors/te/termui轻松处理用户输入下一篇Carbon与Laravel打造完美的PHP时间处理解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表