认证与授权

认证和授权,这两个词经常混在一起说。但说白了,它们干的完全不是同一件事。

认证 vs 授权:先分清谁是谁

认证,是证明“你是谁”。比如你输入密码登录系统,系统确认你确实是那个用户。

授权,是决定“你能做什么”。系统知道你是谁之后,再判断你有没有权限看这份报表、删这条记录。

我几年前接手过一个老项目,代码里把认证和授权逻辑写在一起,搞得后续加权限规则时一头雾水。后来全部拆开,清爽多了。

维度认证授权
回答的问题你是谁?你可以做什么?
典型操作登录、指纹验证、扫码检查角色、判断权限
失败结果拒绝登录拒绝操作
常见实现密码、OAuth、JWTRBAC、ACL、ABAC

记住:认证先于授权。系统必须知道你是谁之后,才能决定让你干什么。

常见认证方式

市面上主流的认证手段,我挑几个常用的说说。

  • 密码认证 – 最古老也最基础。客户端把密码发给服务端校验。要注意加盐哈希,别存明文。我曾经见过一个系统直接把密码明文存数据库,吓得我赶紧建议改造。
  • 多因素认证 (MFA) – 密码+短信验证码、密码+谷歌验证器。多一层防护,暴力破解基本没戏。
  • 基于证书的认证 – 适用于内网或高安全场景。客户端出示数字证书,服务端验证CA签名。配置稍复杂,但安全等级高。
  • OAuth 2.0 / OpenID Connect – 第三方登录的标配。GitHub、微信、Google都支持。OAuth是授权协议,但常被用来做认证。OpenID Connect在OAuth之上加了一层身份层,更安全。
  • 单点登录 (SSO) – 一次登录,多个系统通行。背后依赖SAML、CAS或OAuth。用户方便,但单点故障风险也集中。

选型建议:对外业务系统优先考虑OAuth 2.0 + OpenID Connect;内部系统可以用LDAP或CAS;高安全场景上证书或MFA。

授权模型:怎么管权限

授权模型决定了权限怎么组织、怎么分配。我做过四个项目用了四种模型,各有优缺点。

模型核心思路适用场景
自主访问控制 (DAC)文件所有者自行决定谁可以访问个人桌面、简单共享
强制访问控制 (MAC)系统根据安全标签控制,用户不能绕过军事、政府等高安全环境
基于角色的访问控制 (RBAC)用户->角色->权限,角色是桥梁企业应用,最常用
基于属性的访问控制 (ABAC)根据用户属性、资源属性、环境条件动态判断复杂场景,如医疗、金融

我个人习惯是:能上RBAC就上RBAC。大多数业务用角色管理就够了。只有遇到跨维度权限(比如地域、时间、数据等级)才考虑ABAC。

认证与授权的核心流程图

下面这张图帮你理清用户从登录到访问资源的完整链路。你会看到认证和授权各司其职,中间通过令牌()衔接。

认证与授权核心流程 用户 用户名+密码 认证服务 验证身份 发放 携带 资源服务 检查 有效性 请求授权 授权服务 检查角色/属性 允许 / 拒绝 响应数据 数据 / 功能 关键点 • 认证在前,授权在后 • 是桥梁 • 授权结果决定访问

避坑指南

  • 不要把放URL里 – 浏览器历史记录、referer都会泄露。要放Header或Secure Cookie。
  • 记得设置有效期 – 太短影响体验,太长增加风险。我一般用15分钟~2小时,配合Refresh 。
  • 授权不要依赖Cookie – 曾经有个系统直接拿Cookie里的role字段判断权限,结果用户改个Cookie就能提权,惨痛教训。
  • 服务端验证永远不可信 – 所有权限判断必须放在后端,前端只做展示。我曾经被要求在前端隐藏某些按钮,但后端没限制,结果数据被全量拉走……

再次强调:认证和授权是两个独立的功能模块。不要把验证身份的代码和判断权限的代码混在一个函数里。后续维护时你会哭的。