认证与授权
认证和授权,这两个词经常混在一起说。但说白了,它们干的完全不是同一件事。
认证 vs 授权:先分清谁是谁
认证,是证明“你是谁”。比如你输入密码登录系统,系统确认你确实是那个用户。
授权,是决定“你能做什么”。系统知道你是谁之后,再判断你有没有权限看这份报表、删这条记录。
我几年前接手过一个老项目,代码里把认证和授权逻辑写在一起,搞得后续加权限规则时一头雾水。后来全部拆开,清爽多了。
| 维度 | 认证 | 授权 |
|---|---|---|
| 回答的问题 | 你是谁? | 你可以做什么? |
| 典型操作 | 登录、指纹验证、扫码 | 检查角色、判断权限 |
| 失败结果 | 拒绝登录 | 拒绝操作 |
| 常见实现 | 密码、OAuth、JWT | RBAC、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就能提权,惨痛教训。
- 服务端验证永远不可信 – 所有权限判断必须放在后端,前端只做展示。我曾经被要求在前端隐藏某些按钮,但后端没限制,结果数据被全量拉走……
再次强调:认证和授权是两个独立的功能模块。不要把验证身份的代码和判断权限的代码混在一个函数里。后续维护时你会哭的。