新闻社面试

介绍下SSO 使用了哪些SSO中间件? SSO 和 AUTH 认证的区别?

特性 AUTH (认证) SSO (单点登录)
范围 单个应用程序或系统 多个应用程序或系统
目标 验证用户身份 允许用户使用一组凭据访问多个应用程序,无需重复登录
实现 可以使用用户名/密码、OAuth、OpenID Connect 等方式 通常基于 OAuth 2.0、OpenID Connect、SAML 等协议,需要一个集中的认证服务器或中间件
用户体验 用户需要为每个应用程序单独登录 用户只需登录一次,即可访问所有已授权的应用程序
安全性 如果每个应用程序都独立管理认证,安全性可能参差不齐 集中管理认证,可以更方便地实施统一的安全策略,例如多因素认证、密码策略等
复杂性 相对简单 相对复杂,需要部署和配置认证服务器或中间件,并集成到各个应用程序中
  1. sso java生态插件 使用的xxl-sso

    概念 说明
    SSO Server 中央认证服务,支持集群
    SSO Client 接入 SSO 认证中心的 Client 应用
    SSO SessionId 登录用户会话 ID,SSO 登录成功为用户自动分配
    SSO User 登录用户信息,与 SSO SessionId 相对应
  2. 基于Cookie,相关概念
    登陆凭证存储:登陆成功后,用户登陆凭证被自动存储在浏览器Cookie中
    Client端校验登陆状态:通过校验请求Cookie中的是否包含用户登录凭证判断
    系统角色模型:
    SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
    Client应用:受SSO保护的Client端Web应用,为用户浏览器访问提供服务
    用户:发起请求的用户,使用浏览器访问

  3. 基于Token,相关概念
    登陆凭证存储:登陆成功后,获取到登录凭证(xxl_sso_sessionid=xxx),需要主动存储,如存储在 localStorage、Sqlite 中
    Client端校验登陆状态:通过校验请求 Header参数 中的是否包含用户登录凭证(xxl_sso_sessionid=xxx)判断;因此,发送请求时需要在 Header参数 中设置登陆凭证
    系统角色模型:
    SSO Server:认证中心,提供用户登陆、注销以及登陆状态校验等功能
    Client应用:受SSO保护的Client端Web应用,为用户请求提供接口服务
    用户:发起请求的用户,如使用Android、IOS、桌面客户端等请求访问

  4. 未登录状态请求处理
    基于Cookie,未登录状态请求:
    页面请求:redirect 到SSO Server登录界面
    JSON请求:返回未登录的JSON格式响应数据
    数据格式:
    code:501 错误码
    msg:sso not login.
    基于Token,未登录状态请求:
    返回未登录的JSON格式响应数据
    数据格式:
    code:501 错误码
    msg:sso not login.

设计一个投票系统 每人投票10次

  1. 前端
    1. 基础防抖
    2. 配合加载动画 防止误操作重复提交
    3. 页面性能优化
      1. 静态资源:将css js 图片等静态资源上传至CDN 利用CDN 节点换成 加速资源加载。降低源站带宽压力。
      2. 懒加载:若页面有投票结果展示、候选人列表等非关键内容,采用懒加载技术,滚动到可视区域再加载,减少首屏渲染时间
  2. 网关设计
    1. 流量接入和分发
      1. Nginx 配置:作为边缘网关,监听 80/443 端口,通过upstream配置后端业务服务集群,采用轮询或加权轮询策略分发请求,均衡负载;开启keepalive保持长连接,减少 TCP 握手开销。
        API 网关:引入 Spring Cloud Gateway 或 Zuul,统一拦截投票请求,校验请求合法性(如 Token 有效性、参数格式),非法请求直接拦截,减少业务服务压力;同时通过Gateway Filter实现路由转发,将投票请求导向业务服务。
    2. 全局流控
      1. 基于 Nginx 的限流:利用ngx_http_limit_req_module,按 IP 维度设置请求速率(如 1 秒内单个 IP 最多 20 次请求),超出阈值返回 503,拦截恶意高频请求。
      2. 网关动态流控:结合 Sentinel 或 Hystrix,根据业务服务负载、QPS 动态调整流控规则,保障系统不被压垮;针对投票接口,设置单接口 QPS 上限(如 10 万 / 秒 ),超过则触发限流降级
  3. 业务层设计
    1. Redis 计数与校验:以用户ID + 日期为 Key(如vote:uid:123:20241001 ),Redis 的INCR命令实现原子计数,判断用户当日投票数是否≤10,若超限直接返回 “今日票数已用完”。
  4. 服务高可用与扩展
    1. 微服务集群: 将投票服务部署为多实例集群,通过注册中心(如 Nacos、Eureka)实现服务发现与注册,网关层动态路由请求到不同实例,故障时自动熔断、降级,保障服务连续性。
    2. 异步化优化:对于非关键逻辑(如投票成功后的积分发放、异步统计),引入消息队列(如 Kafka、RocketMQ),业务服务发送消息后立即返回响应,异步线程消费消息处理后续逻辑,提升接口响应速度。
posted @ 2025-07-01 16:48  贺艳峰  阅读(18)  评论(0)    收藏  举报