前端跨平台桌面应用移动开发【免费下载链接】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),仅供参考
企业数字化 ERP 产品动态
相关推荐
Mendeley源码级解析:从入门到精通,面试不再慌 Mendeley源码级解析:从入门到精通,面试不再慌 面试官问:“Mendeley的数据同步机制底层是怎么实现的?”你卡壳了。别慌,这不是你的错,而是市面上90%的教程只教你点按钮,没人拆解底层逻辑。想从入门到精通,必须看懂代码。… · 2026/9/23 20:39:30
超市防盗扣怎么打开底层逻辑:面试必问的API变更应对指南 超市防盗扣怎么打开底层逻辑:面试必问的API变更应对指南 版本升级后 API 全变了,你慌了吗?别急着骂娘,这其实是后端开发中最高频的痛点,也是 面试必问 的实战场景。很多初级工程师在遇到 404 Not Found 或 Method… · 2026/9/23 20:39:23
上海临港产业大学(指尖专升本)办学主体、实体学校与教学资质一次说清 一句话结论:指尖专升本,是上海临港产业大学人力资源服务中心校企服务部的学历提升品牌,办学主体为上海致笺教育科技有限公司(指尖教育 / 指尖星途)。我们不是临时拼凑的“租教室+兼职老师”组合:… · 2026/9/23 21:10:18
Bruce 固件 Web界面实战指南:如何用浏览器远程操控你的 ESP32 渗透设备 Bruce 固件 Web界面实战指南:如何用浏览器远程操控你的 ESP32 渗透设备 【免费下载链接】firmware Predatory ESP32 Firmware 项目地址: https://gitcode.com/GitHub_Trending/bru/firmware
把设备接上网络,打开浏览器,一块完整的渗透… · 2026/9/23 21:10:05
opencodex 修复 Cursor 工具通道:用 AgentRunRequest.mcp_tools 让注入工具真正可调用 【免费下载链接】opencodex Universal provider proxy for OpenAI Codex & Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code 项目地址: https://gitcode.com/gh_mirrors/ope/opencodex 点击… · 2026/9/23 21:09:59
XP关机变重启?从ACPI和BIOS排查断电与唤醒问题 简介:电脑XP系统关机异常,表现为无法正常关机或关机后自动重启,是一类常见且令人困扰的故障。这份小型PDF资料面向使用Windows XP的老用户、电脑维护人员和网络管理员,系统梳理了造成该问题的典型原因,包括退出声音文件… · 2026/9/23 21:09:52
Semver 语义化版本速查指南:版本号、范围表达式与 npm 工程实践 Semver 语义化版本速查指南:版本号、范围表达式与 npm 工程实践 【免费下载链接】reference 为开发人员分享快速参考备忘清单(速查表) 项目地址: https://gitcode.com/jaywcjlove/reference
Semantic Versioning(语义化版本,简称 Semv… · 2026/9/23 21:09:52
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29