小明的登录认证鉴权技术漫谈

介 绍 一 下 登 录 认 证 授 权 相 关 技 术 点 概 况 ~ ~ ~

小 明 的 摄 影 网 站 越 做 越 火 , 访 客 从 几 十 到 几 万 。 他 发 现 , 要 让 网 站 既 好 用 又 安 全 , 得 搞 懂 一 堆 认 证 鉴 权 的 技 术 。 今 天 , 他 就 用 自 己 的 故 事 , 给 大 家 掰 扯 掰 扯 这 些 技 术 到 底 是 啥 、 有 啥 用 、 咋 用 。


** 第 一 课 : Session —— 服 务 器 的 “ 临 时 通 行 证 ” **

小 明 最 初 的 烦 恼 : 用 户 登 录 后 , 怎 么 记 住 他 已 经 登 录 了 ? 总 不 能 每 次 点 击 都 让 他 重 新 输 密 码 吧 ?

** 是 什 么 ? **

Session 就 像 服 务 器 给 每 个 登 录 用 户 发 的 “ 临 时 通 行 证 ” 。 用 户 登 录 成 功 后 , 服 务 器 在 自 己 的 地 盘 ( 内 存 或 数 据 库 ) 存 一 个 “ 通 行 证 夹 ” , 里 面 写 着 用 户 ID 、 登 录 时 间 等 信 息 , 并 给 这 个 夹 子 编 个 唯 一 号 码 , 叫 SessionID 。

** 有 啥 用 ? **

维 持 用 户 的 登 录 状 态 。 用 户 后 续 访 问 网 站 , 服 务 器 看 到 SessionID , 就 能 找 到 对 应 的 “ 通 行 证 夹 ” , 知 道 “ 哦 , 这 是 小 明 , 已 经 登 录 了 ” , 不 用 再 验 证 密 码 。

** 咋 用 ? **

  1. ** 发 证 ** : 用 户 输 入 正 确 密 码 登 录 , 服 务 器 创 建 Session , 存 用 户 信 息 , 生 成 SessionID ;
  2. ** 传 证 ** : 服 务 器 把 SessionID 塞 进 Cookie ( 下 课 讲 ) 发 给 浏 览 器 ;
  3. ** 验 证 ** : 用 户 再 访 问 , 浏 览 器 自 动 带 SessionID 来 , 服 务 器 查 Session 是 否 有 效 ( 没 过 期 、 没 被 踢 掉 ) 。

💡 小 明 的 体 会 : Session 像 饭 店 给 顾 客 的 “ 暂 住 牌 ” , 牌 在 手 , 服 务 员 就 知 道 你 是 谁 , 不 用 每 次 报 手 机 号 。


小 明 发 现 , SessionID 总 得 有 个 地 方 存 , 不 然 浏 览 器 咋 记 住 ? 这 就 轮 到 Cookie 上 场 了 。

** 是 什 么 ? **

Cookie 是 浏 览 器 存 在 本 地 的 “ 小 纸 条 ” , 专 门 用 来 记 录 一 些 简 单 信 息 。 对 Session 来 说 , Cookie 就 是 装 SessionID 的 “ 通 行 证 夹 ” 。

** 有 啥 用 ? **

帮 助 浏 览 器 在 不 同 请 求 间 “ 背 着 ” SessionID , 让 服 务 器 能 识 别 用 户 。 没 Cookie , 用 户 每 点 一 个 链 接 , 服 务 器 就 “ 眼 瞎 ” 了 , 不 知 道 是 谁 在 访 问 。

** 咋 用 ? **

  1. ** 设 置 ** : 服 务 器 响 应 时 , 用 Set - Cookie 头 告 诉 浏 览 器 : “ 存 下 这 个 SessionID , 以 后 带 来 ” ;
  2. ** 携 带 ** : 浏 览 器 自 动 在 后 续 请 求 的 Cookie 头 里 带 上 SessionID ;
  3. ** 安 全 加 固 ** : 给 Cookie 加 HttpOnly ( 防 JS 偷 ) 、 Secure ( 仅 HTTPS 传 ) 、 SameSite ( 防 CSRF ) 标 签 , 像 给 通 行 证 夹 加 防 盗 锁 。

💡 小 明 的 体 会 : Cookie 像 书 包 里 的 “ 饭 卡 套 ” , 把 饭 卡 ( SessionID ) 装 起 来 , 走 哪 带 哪 。


** 第 三 课 : 加 密 —— 数 据 的 “ 密 码 锁 ” **

小 明 怕 密 码 被 偷 , 想 把 存 在 数 据 库 里 的 密 码 变 成 乱 码 。 这 就 得 用 加 密 技 术 , 像 给 密 码 装 个 “ 密 码 锁 ” 。

** 是 什 么 ? **

加 密 分 两 种 : ** 哈 希 加 密 ** ( 单 向 锁 ) 和 ** 对 称 / 非 对 称 加 密 ** ( 双 向 锁 ) 。

  • ** 哈 希 加 密 ** : 像 把 文 字 扔 进 搅 拌 机 , 搅 成 唯 一 的 乱 码 ( 哈 希 值 ) , 永 远 搅 不 回 去 。 常 用 MD5 、 SHA - 256 、 BCrypt ( 小 明 现 在 用 这 个 ) 。
  • ** 对 称 加 密 ** : 用 一 把 钥 匙 加 密 、 解 密 , 像 用 同 一 把 钥 匙 开 锁 和 锁 门 ( 如 AES ) 。
  • ** 非 对 称 加 密 ** : 用 公 钥 加 密 、 私 钥 解 密 , 像 公 开 的 投 信 箱 ( 公 钥 ) 只 能 往 里 塞 信 , 只 有 你 有 钥 匙 ( 私 钥 ) 能 取 出 来 ( 如 RSA ) 。

** 有 啥 用 ? **

  • ** 哈 希 ** : 存 密 码 用 。 即 使 数 据 库 被 偷 , 黑 客 拿 到 的 也 是 乱 码 , 不 知 道 原 密 码 。
  • ** 对 称 / 非 对 称 ** : 传 输 数 据 用 。 比 如 HTTPS 用 非 对 称 加 密 协 商 密 钥 , 再 用 对 称 加 密 传 数 据 , 防 中 间 人 窃 听 。

** 咋 用 ? **

  • ** 存 密 码 ** : 用 户 注 册 时 , 用 BCrypt 算 密 码 的 哈 希 值 ( 自 带 随 机 盐 ) 存 数 据 库 ; 登 录 时 , 用 同 样 算 法 算 输 入 密 码 的 哈 希 , 和 数 据 库 比 对 。
  • ** 传 数 据 ** : 用 HTTPS 协 议 , 浏 览 器 和 服 务 器 自 动 用 非 对 称 加 密 握 手 , 后 续 用 对 称 加 密 传 数 据 。

💡 小 明 的 体 会 : 哈 希 像 “ 文 字 骨 灰 ” , 留 下 唯 一 痕 迹 却 不 能 复 活 ; 对 称 加 密 像 “ 共 用 钥 匙 ” , 非 对 称 像 “ 公 钥 投 信 箱 ” , 安 全 又 方 便 。


** 第 四 课 : 权 限 校 验 —— 网 站 的 “ 门 禁 卡 分 级 ” **

小 明 的 网 站 有 游 客 、 编 辑 、 管 理 员 , 不 能 让 游 客 删 照 片 。 这 就 需 要 权 限 校 验 , 像 给 不 同 人 发 不 同 级 别 的 “ 门 禁 卡 ” 。

** 是 什 么 ? **

权 限 校 验 就 是 检 查 “ 你 有 没 有 资 格 做 这 件 事 ” 。 常 用 ** RBAC ** ( 基 于 角 色 的 权 限 控 制 ) , 给 用 户 分 角 色 ( 如 管 理 员 ) , 角 色 绑 定 权 限 ( 如 删 照 片 ) 。

** 有 啥 用 ? **

防 止 用 户 “ 越 权 操 作 ” 。 比 如 游 客 只 能 看 , 编 辑 能 上 传 , 管 理 员 能 删 除 , 各 干 各 的 , 不 乱 套 。

** 咋 用 ? **

  1. ** 分 角 色 ** : 用 户 表 里 加 “ 角 色 ” 字 段 ( 如 role = ' ADMIN ' ) ;
  2. ** 存 权 限 ** : 角 色 表 里 写 明 角 色 有 啥 权 限 ( 如 ADMIN 有 delete 权 限 ) ;
  3. ** 校 验 ** : 用 户 操 作 时 , 查 他 的 角 色 , 看 有 没 有 对 应 权 限 。 比 如 删 照 片 按 钮 , 只 对 ADMIN 显 示 。

💡 小 明 的 体 会 : 权 限 校 验 像 游 乐 园 的 “ 项 目 门 票 ” , 有 过 山 车 票 才 能 坐 , 没 票 的 只 能 看 别 人 玩 。


** 第 五 课 : JWT Token —— 自 带 信 息 的 “ 电 子 身 份 证 ” **

小 明 做 了 个 API 接 口 给 手 机 APP 用 , 发 现 Session - Cookie 不 太 方 便 ( APP 不 爱 用 Cookie ) 。 这 时 , JWT Token 来 救 场 了 。

** 是 什 么 ? **

JWT Token 是 一 个 字 符 串 , 像 “ 电 子 身 份 证 ” , 里 面 自 带 用 户 信 息 ( 如 ID 、 角 色 ) 和 签 名 。 格 式 是 三 段 式 : 头 . 载 荷 . 签 名 ( 如 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ . SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ) 。

** 有 啥 用 ? **

** 无 状 态 认 证 ** 。 服 务 器 不 用 存 Session , 用 户 登 录 后 拿 到 JWT , 后 续 请 求 带 JWT 就 行 , 适 合 API 、 微 服 务 等 场 景 。

** 咋 用 ? **

  1. ** 生 成 ** : 用 户 登 录 成 功 , 服 务 器 用 秘 钥 把 用 户 信 息 签 名 成 JWT , 发 给 用 户 ;
  2. ** 携 带 ** : 用 户 访 问 API 时 , 在 Authorization 头 里 带 Bearer < JWT >
  3. ** 验 证 ** : 服 务 器 用 秘 钥 验 证 JWT 的 签 名 ( 防 篡 改 ) , 解 析 载 荷 得 用 户 信 息 , 完 成 认 证 。

💡 小 明 的 体 会 : JWT 像 “ 自 带 介 绍 信 的 身 份 证 ” , 上 面 写 清 楚 “ 我 是 谁 、 我 能 干 啥 ” , 走 哪 都 能 自 证 清 白 , 不 用 回 家 拿 档 案 。


** 第 六 课 : 过 滤 器 链 —— Spring Security 的 “ 安 全 检 查 站 ” **

小 明 发 现 , 认 证 鉴 权 逻 辑 很 多 , 不 能 都 写 在 业 务 代 码 里 。 这 就 需 要 过 滤 器 链 , 像 机 场 的 安 检 站 , 一 站 站 检 查 过 往 的 请 求 。

** 是 什 么 ? **

过 滤 器 链 是 Spring Security 的 核 心 , 由 一 系 列 过 滤 器 组 成 , 每 个 过 滤 器 负 责 一 项 安 全 检 查 。 请 求 像 旅 客 , 依 次 通 过 各 个 检 查 站 , 合 格 才 能 到 达 业 务 代 码 。

** 有 啥 用 ? **

把 认 证 、 授 权 、 防 护 等 安 全 逻 辑 模 块 化 , 自 动 化 。 常 见 过 滤 器 有 :

  • ** UsernamePasswordAuthenticationFilter ** : 检 查 用 户 名 密 码 登 录 ;
  • ** CsrfFilter ** : 防 CSRF 攻 击 ;
  • ** SessionManagementFilter ** : 管 理 Session ;
  • ** FilterSecurityInterceptor ** : 最 终 权 限 校 验 。

** 咋 用 ? **

开 发 者 不 用 手 写 过 滤 器 , Spring Security 已 经 搭 好 了 默 认 链 。 只 需 配 置 哪 些 URL 需 要 认 证 、 哪 些 角 色 能 访 问 , 框 架 就 自 动 调 用 对 应 过 滤 器 。

💡 小 明 的 体 会 : 过 滤 器 链 像 工 厂 的 流 水 线 , 每 个 工 人 ( 过 滤 器 ) 负 责 一 道 工 序 , 产 品 ( 请 求 ) 顺 利 流 转 。


** 第 七 课 : 安 全 上 下 文 —— 请 求 的 “ 临 时 档 案 袋 ” **

小 明 发 现 , 认 证 后 的 用 户 信 息 要 在 多 个 组 件 间 传 递 。 这 就 需 要 安 全 上 下 文 , 像 办 事 时 拎 的 “ 临 时 档 案 袋 ” , 装 着 当 前 用 户 的 所 有 信 息 。

** 是 什 么 ? **

安 全 上 下 文 ( Security Context ) 是 ThreadLocal 存 储 的 对 象 , 包 含 当 前 认 证 用 户 的 详 细 信 息 ( 用 户 名 、 角 色 、 权 限 等 ) 。 每 个 请 求 独 有 一 个 , 请 求 结 束 就 清 空 。

** 有 啥 用 ? **

让 业 务 代 码 能 方 便 获 取 当 前 用 户 信 息 , 不 用 每 次 都 查 数 据 库 。 比 如 @PreAuthorize 注 解 就 是 从 这 里 读 取 用 户 角 色 。

** 咋 用 ? **

框 架 在 认 证 成 功 后 , 自 动 把 UserDetails 对 象 存 入 Security Context 。 业 务 代 码 可 用 SecurityContextHolder.getContext().getAuthentication() 获 取 。

💡 小 明 的 体 会 : 安 全 上 下 文 像 医 生 的 “ 病 历 本 ” , 记 录 着 当 前 患 者 ( 用 户 ) 的 所 有 情 况 , 随 用 随 查 。


** 尾 声 : Spring Security 的 技 术 大 拼 装 **

小 明 懂 了 , Spring Security 就 是 把 这 些 技 术 有 序 组 装 起 来 , 像 搭 积 木 一 样 构 建 安 全 堡 垒 :

** 组 装 原 理 **

  1. ** 请 求 入 口 ** : 浏 览 器 发 送 请 求 , 带 Cookie ( 含 SessionID ) 或 Authorization 头 ( 含 JWT ) ;
  2. ** 过 滤 器 链 检 查 ** :
    • ** CsrfFilter ** 验 CSRF 令 牌 ;
    • ** UsernamePasswordAuthenticationFilter ** 处 理 表 单 登 录 ;
    • ** JwtAuthenticationFilter ** 处 理 JWT 认 证 ;
    • ** SessionManagementFilter ** 管 Session 会 话 ;
  3. ** 认 证 管 理 ** : Authentication Manager 调 用 UserDetailsService 查 用 户 , 用 PasswordEncoder 验 密 码 ;
  4. ** 授 权 判 断 ** : Access Decision Manager 根 据 RBAC 规 则 , 用 户 角 色 权 限 判 断 能 否 访 问 ;
  5. ** 安 全 上 下 文 存 储 ** : 认 证 成 功 后 , 用 户 信 息 存 Security Context , 供 业 务 代 码 使 用 ;
  6. ** 响 应 输 出 ** : 返 回 受 保 护 的 资 源 , 或 返 回 401 / 403 错 误 。

** 核 心 优 势 **

  • ** 开 箱 即 用 ** : 默 认 配 置 覆 盖 80 % 场 景 , 小 明 只 需 配 用 户 存 储 和 加 密 方 式 ;
  • ** 灵 活 扩 展 ** : 可 自 定 义 UserDetailsService ( 从 数 据 库 / LDAP 读 用 户 ) 、 PasswordEncoder ( 换 BCrypt / SCrypt ) ;
  • ** 全 面 防 护 ** : 内 置 CSRF 、 XSS 、 会 话 固 定 、 点 击 劫 持 等 防 护 ;
  • ** 多 端 支 持 ** 既 支 Session - Cookie ( 浏 览 器 ) , 也 支 JWT ( APP / 微 服 务 ) 。

✨ 小 明 的 最 终 体 会 :
Spring Security 像 一 个 经 验 丰 富 的 安 全 管 家 , 把 Session 、 Cookie 、 加 密 、 权 限 、 JWT 、 过 滤 器 链 等 技 术 有 序 组 装 , 让 他 只 需 关 注 “ 用 户 存 哪 、 密 码 咋 加 、 角 色 咋 分 ” , 就 能 拥 有 企 业 级 的 安 全 防 护 。
从 此 , 小 明 的 网 站 像 穿 了 铠 甲 的 骑 士 , 在 互 联 网 的 风 雨 里 , 安 全 守 护 着 每 一 张 摄 影 作 品 。

posted @ 2025-11-24 17:23  佛祖让我来巡山  阅读(1)  评论(0)    收藏  举报

佛祖让我来巡山博客站 - 创建于 2018-08-15

开发工程师个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

Bootstrap中文网