Idea To Business / 页面能登录就够了吗,怎样保证用户只能看到自己的数据?← 返回专题

Web 工程基础 · 实践指南

页面能登录就够了吗,怎样保证用户只能看到自己的数据?

区分身份验证、会话和授权,用两个账号检查真实数据边界,而不只看登录页面。

本页目录
收藏与勾选保存在此浏览器。

直接回答

能注册和登录只证明部分流程可用。身份验证回答“你是谁”,会话管理让后续请求持续识别你,授权决定“你能对哪条数据做什么”。users 与 game_records.user_id 可以表达归属关系,但“注册加一行、登录查一行”只是入门比喻。Next.js 官方指南也将这三项区分,并建议使用合适的认证库降低自行实现的复杂性。整理建议:沿用现有可靠认证方案,把数据权限落实到每个受保护的服务端操作,不能只在界面上隐藏按钮。

适用场景

  • 产品加入个人历史、会员功能或管理后台
  • 登录页面可用,但不确定权限是否正确
  • 数据库中有 user_id,却仍担心数据混到一起

一步一步做

定义身份与角色

列出匿名、普通用户、管理员等实际角色,再写出他们需要读取和修改的资源。付费状态不是管理员身份,知道某条记录 ID 也不代表有权读取。先形成简单权限表,再选择实现,不要先创建复杂角色系统。

检查认证与会话的完整过程

查看注册、登录、退出、会话失效和失败提示的处理。密码不能明文保存,敏感认证逻辑在服务端执行。整理建议:优先接入或复用成熟方案,按实际框架配置 Cookie 和会话,避免把零散示例直接拼成安全系统。

在服务端确定数据归属

查询个人历史时,从已验证的会话获取用户身份,并限定记录归属。不要相信请求体里随意传入的 user_id。读取、更新、下载、删除都要检查;同一条数据的不同入口不能遗漏权限。

保护管理员入口与修改

后台应校验管理员身份、复用现有 schema,并限制可编辑字段。整理建议:后台页面与接口都要验证权限,订单状态不能随意绕开原有状态规则。缺少管理员标记应拒绝访问,而不是为方便调试默认放行。

用两个账户验证边界

在授权测试环境中让 A、B 各自创建记录,确认正常读取各自内容,再检查互换记录 ID、退出后访问、直接请求接口等情形。对权限拒绝检查返回值与数据库实际状态,不能只看前端弹出了一句错误。

纠正密码与会话的安全理解

不能把密码哈希当作可逆加密,也不能认为会话编号被他人看到仍然安全。密码应由成熟认证实现进行带盐的密码哈希与验证,不能明文或可逆存储;弱密码仍可能被猜中,哈希不是无法破解的保证。有效会话标识则相当于临时通行凭据,泄露后可能被冒用。检查 HTTPS、Cookie 的 HttpOnly、Secure、SameSite、有效期,以及退出后服务端会话失效;不要把会话秘密写进日志或普通浏览器存储。

按当前项目核对登录配置

接入前先读实际依赖版本、认证路由、配置读取代码和迁移记录;不要把不同示例的变量名混用。把本地实际端口、应用 base URL、允许来源、供应商回调地址按环境列出,并逐字核对协议、域名、端口和路径。自托管认证仍需数据库和运行维护;托管数据库仍是外部依赖。Google 登录解决身份入口,并不能替代反滥用、付费额度和资源授权。

分别验收登录状态和业务权限

在本地及目标线上环境分别检查首次注册/登录、刷新、退出、会话过期、错误凭据和另一用户访问。对于真实成绩、额度和付款状态,服务端必须从可信记录或受控计算取得,不能接受前端说自己已付费或得到高分。登录失败提示避免泄露账户是否存在;按风险加入尝试次数控制。若只检查“页面显示用户名”,记录为展示通过,不能写认证链路通过。

案例拆解

假设示例:个人历史与排行榜

A 和 B 玩同一个游戏,个人历史页面应只展示当前用户的完整记录,排行榜则只展示设计为公开的信息。即使 A 能在排行榜看到 B 的昵称和分数,也不能因此下载 B 的完整对话。将“公开榜单字段”和“私人记录字段”分开选择,比把整条数据库记录返回浏览器后再隐藏更容易检查。

补充假设示例:应用启动在 3001 端口,OAuth 回调仍填 3000,页面打开不代表登录可用。修正环境映射后用 A 完成登录、刷新和退出,再确认旧会话不能读私人记录;用 B 直接请求 A 的记录也应被拒绝。游戏最终分数即使在浏览器改成 999,服务端也不应据此写入正式榜单。

行动检查

可复制模板

权限验收任务

工作模板
请检查[资源与操作]的权限,不改动无关功能。
先定位认证、会话和授权实现,以及页面/API/下载等全部入口。
列出匿名、A 用户、B 用户、管理员的允许与拒绝场景;在授权测试环境中验证。
重点检查用户身份是否来自可信会话、每次操作是否限定归属、响应是否泄露额外字段。报告证据与未测试范围,不以页面隐藏替代授权。

认证配置与状态验收表

当前认证库/实际安装版本:
认证路由与配置文件:
环境|页面实际URL|base URL变量名|允许来源|供应商回调URL
本地:
预览:
正式:
密码处理:[成熟哈希/验证实现,不填密码或哈希值]
Cookie属性/会话有效期/退出失效方式:
用例|账号角色|操作|页面结果|服务端/数据库结果
首次登录/刷新/退出后直接请求/过期/错误密码/跨账号读写:
用户可提交字段与服务端权威字段:
未测试项及原因:
只记录配置名称和脱敏证据,不复制会话令牌、客户端Secret或测试密码。

易错点

  • 只隐藏管理按钮:用户仍可能直接请求对应接口。
  • 用前端传来的用户 ID 决定归属:身份必须由服务端验证。
  • 给后台加一个 TODO 就算完成保护:未落实的权限检查必须视为未完成。

官方参考

  • Next.js:Authentication — 说明身份验证、会话管理和授权的区别及认证库建议 资料核查记录日期:2026-10-18。

  • OWASP:Password Storage — 说明密码哈希、盐与弱密码仍可被猜测的边界 资料核查记录日期:2026-10-18。

  • OWASP:Session Management — 说明会话标识的凭据意义、Cookie属性和生命周期;不是无意义编号 资料核查记录日期:2026-10-18。

  • Better Auth:Options — 说明baseURL与trustedOrigins配置;具体变量按现项目代码 资料核查记录日期:2026-10-18。

← 返回专题,继续查阅
© Rowan Huang

保持好奇,慢慢构建。