尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Refine v5 与 Ant Design 认证实战:从自定义 AuthProvider 到 AuthPage 构建完整的用户认证体系
Refine v5 与 Ant Design 认证实战从自定义 AuthProvider 到 AuthPage 构建完整的用户认证体系【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine导读本文以 Refine 仓库中的 auth-antd 认证示例 为骨架系统讲解如何在 Refine v5 与 Ant Design 的组合下从零构建一套完全自定义的认证方案通过实现AuthProvider的各个方法控制登录、登出、会话检查与用户权限借助Authenticated组件完成路由级访问控制再使用AuthPage快速落地登录、注册、忘记密码、修改密码四种页面并可接入 Google / GitHub 等第三方 OAuth 登录。阅读完本文你将掌握 Refine 认证机制的完整调用链能够把示例迁移到自己的企业级 React 应用中。一、示例总览auth-antd 的定位与启动方式antd.md 明确指出在 Refine 中认证方式完全由你掌控——你可以按需定制 AuthProvider 的方法并据此控制用户的访问权限。auth-antd 正是这样一个自定义认证 Ant Design 界面的最小完整示例。1.1 项目结构examples/auth-antd/ ├── index.html ├── package.json ├── vite.config.ts └── src/ ├── App.tsx # 认证逻辑 路由 页面装配的入口 ├── index.tsx ├── interfaces/ │ └── index.d.ts # IPost / ICategory 等类型 └── pages/ ├── dashboard.tsx # 展示 getIdentity 与 usePermissions 的仪表盘 └── posts/ # list / edit / show 三个 CRUD 页面整个示例的核心几乎都浓缩在src/App.tsx一个文件里AuthProvider内联定义、路由全部在此声明。与之配套的还有一套完整的 Cypress 端到端测试cypress/e2e/auth-antd/all.cy.ts覆盖登录、注册、忘记密码、修改密码、登出与身份展示等全部场景是验证示例行为的最佳参照。1.2 在本地运行示例参考 examples/auth-antd/README.md可以用如下命令直接创建该示例项目npm create refine-applatest -- --example auth-antd示例默认对接的是 Refine 官方演示数据服务https://api.fake-rest.refine.dev认证凭据在 src/App.tsx 中内联定义const authCredentials { email: demorefine.dev, password: demodemo, };注意这是纯前端模拟认证凭据硬编码在源码中仅用于演示调用链生产环境必须替换为真实的登录接口与凭据存储方案。二、核心骨架实现一个自定义 AuthProviderAuthProvider 指南 指出AuthProvider 是一个包含若干方法的对象由 Refine 在合适的时机消费这些方法每个方法都返回 Promise因此天然支持异步操作。把它作为authProviderprop 传给Refine即完成认证能力的激活import { Refine } from refinedev/core; import authProvider from ./auth-provider; const App () { return Refine authProvider{authProvider} /; };AuthProvider 完整的方法清单如下前四个为必需方法其余为可选方法import type { AuthProvider } from refinedev/core; const authProvider: AuthProvider { // required login: async (params: any): AuthActionResponse, check: async (params: any): CheckResponse, logout: async (params: any): AuthActionResponse, onError: async (params: any): OnErrorResponse, // optional register: async (params: any): AuthActionResponse, forgotPassword: async (params: any): AuthActionResponse, updatePassword: async (params: any): AuthActionResponse, getPermissions: async (params: any): unknown, getIdentity: async (params: any): unknown, };2.1 login登录与第三方 OAuth 分流login的返回类型是AuthActionResponsetype AuthActionResponse { success: boolean; redirectTo?: string; error?: Error; [key: string]: unknown; // 可携带任意附加数据 };在 auth-antd 示例 中login同时处理了三种情况Google OAuth、GitHub OAuth 和邮箱密码登录。当providerName存在时直接把浏览器重定向到 OAuth 授权地址login: async ({ providerName, email }) { if (providerName google) { window.location.href https://accounts.google.com/o/oauth2/v2/auth; return { success: true }; } if (providerName github) { window.location.href https://github.com/login/oauth/authorize; return { success: true }; } if (email authCredentials.email) { localStorage.setItem(email, email); return { success: true, redirectTo: / }; } return { success: false, error: { message: Login failed, name: Invalid email or password }, }; },关键点useLogin钩子的mutate()参数会原样透传给login方法没有任何类型约束。因此你可以自由定义参数结构const { mutate } useLogin{ username: string; password: string; remember: boolean; }(); mutate({ email: demorefine.dev, password: demodemo });login返回success: false时Refine 会自动弹出错误通知其中error对象的name与message即通知文案redirectTo控制登录成功或失败后的跳转路径若不想跳转则返回redirectTo: undefined。2.2 check会话校验与路由守卫check返回CheckResponsetype CheckResponse { authenticated: boolean; redirectTo?: string; logout?: boolean; // 为 true 时登录失效会触发登出 error?: Error; };用户每次导航到受保护页面时Refine 都会在内部调用check。示例中的实现是检查localStorage中是否存在email键check: async () localStorage.getItem(email) ? { authenticated: true } : { authenticated: false, error: { message: Check failed, name: Not authenticated }, logout: true, redirectTo: /login, },从 Cypress 测试all.cy.ts可以验证其行为未登录访问/test-route时会被重定向到/login?to%2Ftest登录成功后自动回到原目标页/test——这正是Authenticated组件结合check返回的redirectTo实现的登录后回跳体验。2.3 logout清理会话logout与login对称负责清除会话数据并返回跳转地址logout: async () { localStorage.removeItem(email); return { success: true, redirectTo: /login }; },useLogout的mutate参数同样无类型限制地透传给logout测试中点击菜单栏的 Logout 后pathname回到/loginall.cy.ts。2.4 onError401/403 自动登出onError在 API 返回错误时被调用适合做token 过期自动登出之类的统一兜底。返回类型OnErrorResponse包含redirectTo、logout、error三个字段其中logout: true会触发logout方法。示例针对error.response.status 401的场景返回{ logout: true }让用户直接退出登录onError: async (error) { if (error.response?.status 401) { return { logout: true }; } return { error }; },配合 useOnError 钩子你可以在任意请求的 catch 分支中把它接入const { mutate } useOnError(); fetch(http://example.com/payment) .then(() console.log(Success)) .catch((error) mutate(error));2.5 可选方法register / forgotPassword / updatePassword这三个方法与login一样返回AuthActionResponse分别对应注册、发送重置密码邮件、更新密码。示例中的实现均为与硬编码凭据比对后的模拟结果例如register: async (params) { if (params.email authCredentials.email params.password) { localStorage.setItem(email, params.email); return { success: true, redirectTo: / }; } return { success: false, error: { message: Register failed, name: Invalid email or password }, }; }, forgotPassword: async (params) { if (params.email authCredentials.email) { // 这里可以发送包含重置链接的邮件 return { success: true }; } return { success: false, error: { message: Forgot password failed, name: Invalid email } }; },值得注意的一个细节详见 auth-provider/index.mdupdatePassword方法除了接收mutate参数外还会自动拿到URL 上的查询参数。例如当访问http://localhost:3000/reset-password?token123时方法签名中会出现tokenupdatePassword: async ({ password, confirmPassword, token }) { console.log(token); // 123 return { success: true, redirectTo: /login }; },这为邮件链接带 token 重置密码的常见业务流提供了现成通道。2.6 身份与权限getIdentity / getPermissions这两个可选方法用于向界面提供当前用户信息与权限数据getIdentity返回用户身份如 id、name、avatar由 useGetIdentity 消费getPermissions返回权限列表由 usePermissions 消费。示例中的实现返回固定身份并演示了向getPermissions透传参数getPermissions: async (params) params?.permissions, getIdentity: async () ({ id: 1, name: Jane Doe, avatar: https://unsplash.com/photos/IWLOvomUmWU/download?forcetruew640, }),在 pages/dashboard.tsx 中这两个方法被真实消费——仪表盘用卡片展示identity?.name与头像并调用带params: { permissions: [admin] }的usePermissionsconst { data: identity } useGetIdentity{ id: string; name: string; avatar: string }(); const permissions usePermissionsstring[], { permissions: string[] }({ params: { permissions: [admin] }, });all.cy.ts 中的get identity测试断言登录后页面出现Jane Doe文本且头像img带src属性从端到端角度验证了这条链路。提示若需要更复杂的授权逻辑如资源级访问控制官方建议使用独立的accessControlProvider而非在getPermissions里堆砌判断见 auth-provider/index.md。三、路由级保护Authenticated 组件与路由编排3.1 Authenticated 的三种渲染分支Authenticated是useIsAuthenticated的组件形态其行为由内部检查结果驱动data.authenticated true渲染 childrendata.authenticated false渲染fallbackprop若未提供 fallback则跳转到check返回的redirectTo或redirectOnFailprop 指定的地址isLoading true渲染loadingprop。App.tsx 中一共用了三处Authenticated各自承担不同职责受保护业务路由——未登录一律重定向到/loginRoute element{ Authenticated keyauthenticated-routes fallback{CatchAllNavigate to/login /} ThemedLayout Outlet / /ThemedLayout /Authenticated } Route index element{DashboardPage /} / Route path/posts.../Route /Route认证页面路由——已登录用户访问/login、/register等页面时直接送回业务页NavigateToResource resourcepostsRoute element{ Authenticated keyauth-pages fallback{Outlet /} NavigateToResource resourceposts / /Authenticated } Route path/login element{AuthPage typelogin ... /} / ... /Route兜底 404 路由——未登录时先走登录页已登录才展示错误组件Route element{ Authenticated keycatch-all ThemedLayout Outlet / /ThemedLayout /Authenticated } Route path* element{ErrorComponent /} / /Route3.2 key 属性的必要性Authenticated 文档 特别强调当Authenticated在同一树层多次使用时必须为每次使用设置不同的key。因为 React 在 props 变化时默认更新而非重挂载组件若沿用上一次的检查结果渲染内容可能出现未登录内容闪烁的异常。示例中keyauthenticated-routes、keyauth-pages、keycatch-all三个不同值正是为此而设。四、落地认证页面AuthPage 组件与 Ant Design 集成4.1 四种页面类型AuthPage是 Refine 内置的认证页面组件包含四种类型type页面用途提交后调用的 AuthProvider 方法login默认登录loginregister注册registerforgotPassword忘记密码forgotPasswordupdatePassword修改密码updatePassword在示例的认证路由组中四种页面一一对应Route path/login element{AuthPage typelogin ... /} / Route path/register element{AuthPage typeregister ... /} / Route path/forgot-password element{AuthPage typeforgotPassword /} / Route path/update-password element{AuthPage typeupdatePassword /} /4.2 集成第三方登录 providers登录/注册页通过providersprop 渲染 OAuth 按钮数组每项包含name透传给login/register的providerName、icon、labelAuthPage typelogin formProps{{ initialValues: { ...authCredentials } }} providers{[ { name: google, label: Sign in with Google, icon: GoogleOutlined style{{ fontSize: 24, lineHeight: 0 }} /, }, { name: github, label: Sign in with GitHub, icon: GithubOutlined style{{ fontSize: 24, lineHeight: 0 }} /, }, ]} /对应地AuthProvider 的login方法通过解构providerName识别是哪个第三方平台进而执行 OAuth 跳转见本文 2.1 节。4.3 常用 props 一览AuthPage 文档 还提供了以下常用定制能力hideForm设为true时隐藏表单只显示 providers适合仅第三方登录的场景rememberMe自定义记住我组件传false则不渲染仅 login 类型loginLink/registerLink/forgotPasswordLink自定义页面间跳转链接默认值分别为/login、/register、/forgot-passwordwrapperProps/contentProps/formProps分别向最外层容器、卡片容器、表单透传属性如样式、initialValues、onSubmitrenderContent接收默认内容可在其上下追加自定义头部/尾部元素mutationVariables向 AuthProvider 方法注入附加变量例如AuthPage typelogin mutationVariables{{ foo: bar, xyz: abc }} / // login 方法中可拿到 login: async ({ foo, xyz, ...otherProps }) { console.log(foo); // bar console.log(xyz); // abc };示例中正是用formProps.initialValues把演示账号demorefine.dev / demodemo预填进登录表单方便快速体验。4.4 与 Ant Design 主题、通知体系挂钩auth-antd 完整展示了 Refine × Ant Design 的装配方式外层用ConfigProvider套上RefineThemes.Blue主题、AntdApp提供 antd 上下文Refine的notificationProvider使用refinedev/antd的useNotificationProvider这样 AuthProvider 返回success: false时错误通知便会以 antd 通知的形式弹出——Cypress 测试中的cy.getAntdNotification()断言all.cy.ts验证的正是这条链路ConfigProvider theme{RefineThemes.Blue} AntdApp Refine authProvider{authProvider} dataProvider{dataProvider(API_URL)} routerProvider{routerProvider} notificationProvider{useNotificationProvider} options{{ syncWithLocation: true, warnWhenUnsavedChanges: true }} {/* Routes */} UnsavedChangesNotifier / DocumentTitleHandler / /Refine /AntdApp /ConfigProvider五、端到端验证用 Cypress 测试认证行为示例仓库配套的 cypress/e2e/auth-antd/all.cy.ts 完整刻画了认证系统的预期行为可作为验收清单登录成功填写凭据后提交pathname变为/localStorage中出现email键登录失败错误凭据触发含login failed的通知且停留在/login回跳机制未登录访问/test后重定向到/login?to%2Ftest登录成功后回到/test注册通过 Sign up 链接进入/register成功注册后进入首页忘记密码/修改密码错误邮箱、错误密码均弹出对应错误通知两次密码不一致时表单校验提示do not match登出点击菜单 Logout 后回到/login身份展示登录后页面渲染Jane Doe与头像。测试使用的凭据来自 cypress/fixtures/demo-auth-credentials.json与示例源码中的authCredentials一致{ email: demorefine.dev, password: demodemo }这套测试既可用于回归验证也直观展示了认证行为应该如何被断言是理解 Refine 认证体系运行结果的绝佳辅助材料。六、从示例到生产落地建议把 auth-antd 的骨架迁移到真实项目时有几个方向值得参考详见 guides-concepts 认证指南 相关章节凭据与密钥示例中的硬编码凭据、内联 OAuth 跳转地址仅用于演示生产环境应将登录请求交给真实后端token 的存放、刷新与过期处理需结合onError如 401 时刷新 token 或登出统一设计。刷新令牌机制可在onError中捕获 401 后先尝试刷新 token刷新失败再logoutcheck也应基于真实 token 的有效性返回authenticated。参数化 redirectTo善用redirectTo与redirectPath约定配合Authenticated的appendCurrentPathToQuery让登录后能精准回到用户原本要访问的页面。升级兼容若项目仍在使用 v4 时代的旧版 AuthProviderRefine 在 v5 之前通过legacyAuthProviderprop 保持向后兼容迁移细节可参考 迁移指南。结语从 antd.md 指出的认证方式完全由你掌控出发本文沿着 auth-antd 示例的完整调用链——AuthProvider方法实现、Authenticated路由保护、AuthPage页面装配、Ant Design 主题与通知集成、Cypress 端到端验证——逐步还原了 Refine v5 自定义认证的每一个环节。无论你是要接入 OAuth 还是自建邮箱密码体系这套模式都可以直接复用核心逻辑全部收敛在 AuthProvider 对象中UI 层则交给 Refine 与 Ant Design 现成的组件既灵活又可控。【免费下载链接】refineA React Framework for building internal tools, admin panels, dashboards B2B apps with unmatched flexibility.项目地址: https://gitcode.com/GitHub_Trending/re/refine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

腰果缺陷检测YOLO数据集详解:目录、标签与训练实战

腰果缺陷检测YOLO数据集详解:目录、标签与训练实战

简介:面向目标检测与工业缺陷识别场景的腰果缺陷YOLO数据集,共5类:Broken、Defect、SplitDown、SplitUp、Whole,已按YOLOv5目录结构划分训练集3186张、验证集304张、测试集150张,每张图片均含对应txt标签,采…

📅 2026/9/11 20:55:58
用Python可视化分析智能手机价格数据集:RAM如何左右定价?

用Python可视化分析智能手机价格数据集:RAM如何左右定价?

简介:面向数据分析初学者、消费电子市场研究者及智能手机行业从业者的智能手机价格可视化分析资料包,聚焦品牌、型号、屏幕尺寸、处理器速度、内存大小、存储容量、摄像头规格、发布日期、价格等核心字段,通过真实数据集揭示价格与配置、品牌…

📅 2026/9/11 20:55:58
基于深度学习1DCNN的轴承故障诊断:从振动信号到端到端分类实践

基于深度学习1DCNN的轴承故障诊断:从振动信号到端到端分类实践

简介:基于深度学习的1DCNN轴承故障诊断源码包,面向机械故障诊断、工业预测性维护领域的工程师与研究人员,提供从振动信号预处理、1DCNN模型构建、训练优化到故障分类的完整实现方案。资源共50个文件,包体仅3.64MB,以Py…

📅 2026/9/11 20:55:58
MORE NEWS

更多资讯

📰

CPython 自由线程构建 QSBR 槽位泄漏修复解析:从 gh-issue-155363 看线程状态创建失败路径的回收机制

CPython 自由线程构建 QSBR 槽位泄漏修复解析:从 gh-issue-155363 看线程状态创建失败路径的回收机制 【免费下载链接】cpython The Python programming language 项目地址: https://gitcode.com/GitHub_Trending/cp/cpython 导读 本文围绕 CPython 仓库中一…

📰

六款AI编程助手全栈实测:最终留下Claude Code和Cursor

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

OMP 中的 OpenAI Harmony 方言:gpt-oss 函数调用线格式与流式解析实战

OMP 中的 OpenAI Harmony 方言:gpt-oss 函数调用线格式与流式解析实战 【免费下载链接】oh-my-pi ⌥ Coding agent with the IDE wired in 项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi Harmony 是 OpenAI 为其开源权重模型 gpt-oss 系列&…

📰

MCU如何通过I²C控制光模块并实现亚微秒时间戳

1. 光模块从来不是MCU的“舒适区”,但这次真被盯上了“MCU盯上光模块了!”——看到这个标题,我第一反应是笑出声。不是因为荒谬,而是太熟悉这种“跨界突袭”的节奏。干了十多年嵌入式开发,从8051到ARM Cortex-M7&#…

📰

Harbor 项目创建权限管控:从配置文件到 API 校验的完整实践

Harbor 项目创建权限管控:从配置文件到 API 校验的完整实践 【免费下载链接】harbor An open source trusted cloud native registry project that stores, signs, and scans content. 项目地址: https://gitcode.com/GitHub_Trending/ha/harbor 导读 Harbo…

📰

标定板分辨率全解析:高精度视觉系统的核心选型与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬