Skip to main content

搜索隔离、防越权拦截与销售代客 SOP (Isolation & On-Behalf SOP)

适用岗位:销售业务经理、电商技术支持、安全合规专员、系统实施顾问
核心目标:深入理解商城前台四重服务端强拦截机制,掌握直接 URL 越权防护与搜索彻底隔离的验证方法,熟练运用“销售代客下单(On-Behalf)”实现全景与客户受限视角的无缝切换。


1. 为什么“仅在前端隐藏分类”是远远不够的?

在许多开源或简易电商插件中,所谓的“分类权限”往往仅仅是在前端模板中利用 CSS 或条件渲染隐藏了侧边栏菜单(即“掩耳盗铃式隐藏”)。这种做法存在严重的安全漏洞:

┌────────────────────────────────────────────────────────────────────────┐
│ 传统前端隐藏的致命漏洞 │
├────────────────────────────────────────────────────────────────────────┤
│ ❌ 搜索漏洞:客户在顶部搜索框输入未授权商品名或条码,仍能搜出商品详情;│
│ ❌ 链接漏洞:客户通过历史订单、收藏夹或直接输入 /shop/product/ID 能打开; │
│ ❌ 分类直达:直接在地址栏敲入 /shop/category/ID 依然能展示全部未授权商品; │
│ ❌ 加购漏洞:通过接口或脚本绕过前台校验直接加入购物车完成结算。 │
└────────────────────────────────────────────────────────────────────────┘

3will_website_sale_category_customer_filter 严格遵循企业级内控安全标准,在服务端底层构建了四重硬核拦截机制:

                               【客户发起前台请求】

┌────────────────────────────────┼────────────────────────────────┐
▼ ▼ ▼
【请求 1:搜索或选品】 【请求 2:分类页面直达】 【请求 3:商品详情直达】
/shop?search=... /shop/category/ID /shop/product/ID
│ │ │
▼ ▼ ▼
【底层商品过滤器】 【_tw_website_sale_pre_shop】 【_tw_website_sale_pre_product】
注入 allowed_ids 并集约束 校验 category.id 是否在 校验商品挂载分类与
过滤 search_product 结果 客户 allowed_ids 中 allowed_ids 是否有交集
│ │ │
彻底无匹配 (No results) ❌ 不在 ➔ 302 重定向到 /shop ❌ 无交集 ➔ 302 重定向到 /shop

2. 搜索彻底隔离实况验证 (Search Isolation)

2.1 业务场景测试

餐饮客户(如 100 DEGREE HOT POT)登录商城后,虽然左侧分类树中已看不到西人超市专区,但若其在顶部搜索框主动搜索西人专属商品名称(例如输入 发酵黄油):

搜索彻底隔离实况

2.2 行为结果分析

  • 返回结果:页面明确显示大号放大镜图标与 No results / No results for '发酵黄油'
  • 底层原理:在 3will_website_sale_base 与模块扩展的 _tw_website_sale_filter_shop_search_product 中,系统在服务端对返回的搜索商品集按客户有效公开分类集合(allowed_ids)执行集合求交过滤,非授权分类下的所有商品在第一时刻被剔除,从根源杜绝了信息泄漏。

3. 直接 URL 越权访问 302 重定向防护 (URL Guard)

3.1 场景 A:直接敲入未授权分类路由

  • 测试路径:餐饮客户在浏览器地址栏手动输入西人专区路由(如 http://.../shop/category/151);
  • 系统响应:触发 _tw_website_sale_pre_shop 钩子,系统检测到分类 151(西式冷冻面团与黄油)不在该客户的允许分类集合中,即刻下发 HTTP 302 临时重定向,将浏览器强行拉回 /shop 主页
  • 用户感知:页面安全回退至合法的选品总览页,用户无法查看到分类下的任何商品列表。

直接 URL 拦截重定向实况

3.2 场景 B:直接敲入未授权商品详情路由

  • 测试路径:餐饮客户通过外部链接或历史书签直接访问仅属于西人专区的商品详情页(如 http://.../shop/product/10478);
  • 系统响应:触发 _tw_website_sale_pre_product 钩子,系统比对该商品绑定的所有 public_categ_ids 与客户 allowed_ids
product.public_categ_ids ∩ allowed_ids = ∅

交集为空,系统立刻下发 HTTP 302 重定向至 /shop,阻止用户查看商品详情与加入购物车。


4. 销售人员全景视角与代客下单(On-Behalf)实操

在 B2B 批发业务中,内部销售代表既需要协助客户下单(必须与客户视角一致,避免误报不可供产品),又需要在日常进行全库巡检与大盘咨询。系统完美支持这两种视角的自由无缝切换。

4.1 销售人员未代客时的“上帝视角” (All-Access View)

  • 销售人员使用内部账号(如 Mitchell Admin)登录商城前台;
  • 系统识别机制:识别当前用户为内部员工(user._is_internal() == True)且未进入代客模式;
  • 前台表现
    • 侧边栏展示全量分类树(包括通用、餐饮、西人超市所有专区);
    • 列表与搜索开放全库所有上架商品
    • 销售人员可随时查询任意品类的价格与库存。

4.2 进入代客下单模式 (On-Behalf Mode)

当销售员需要替某一特定客户(如 100 DEGREE HOT POT)录入订单时:

销售代客下单视角动态切换

  1. 激活代客:点击顶部导航栏的【代客下单 (Order for Customer)】;
  2. 选择目标客户:在弹出弹窗中检索并选中客户 100 DEGREE HOT POT
  3. 前台即刻响应
    • 顶部常驻醒目的蓝色代客横幅

      Current Customer: 100 DEGREE HOT POT
      Price Source: Default (AUD)
      Current Salesperson: Mitchell Admin

    • 分类树与商品瞬时收敛:商城视角立刻切换为该客户专属视角!西人超市专区消失,分类树只剩下【通用】和【餐饮专用】;
    • 销售人员所见目录与价格完全等同于客户本人登录,确保代客下单所选商品 100% 属于客户协议范畴。

4.3 退出或切换代客

  • 切换其他客户:点击蓝色横幅中的【Switch Customer / 切换客户】,选择新客户,目录自动按照新客户的标签重新渲染;
  • 退出代客:点击【Exit On-Behalf / 退出代客】,横幅消失,界面瞬时恢复为内部销售人员的全景上帝视角。

5. 销售与实施常见安全守则

  1. 代客合规防线:销售代表在代客模式下,系统严格限制其只能挑选目标客户有权限的商品加入购物车。若销售代表尝试通过代客模式加购未授权商品,系统同样会触发拦截,确保业务合规;
  2. 账号权限隔离:切勿将销售内部账号密码告知外部客户;外部客户只能使用分配了【Portal / 门户】权限的账号登录,受严格的服务端分类过滤监管。