人力资源

Odoo Kiosk 打卡为什么不能拿地理位置当“硬门禁”:PIN 认证、设备追踪与 geolocation 只是不同层

很多团队看到 Kiosk 支持 PIN、设备信息和地理位置,就以为 Odoo 已经内建了一套“人在指定地点才能打卡”的硬门禁。可从 hr_attendance 控制器能看出,PIN、device tracking 和 geolocation 分别服务于身份确认、留痕与来源说明,并不是同一个强制控制层。

人力资源
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

先说结论

Odoo Attendance 里的 kiosk、PIN、device tracking 和 geolocation,并不会自动组成一套“只有人在公司范围内才允许打卡”的硬门禁系统。

hr_attendance/controllers/main.py 这条链能看得很清楚:

  • manual_selection() 用 PIN 做的是身份二次确认
  • _get_geoip_response() 收集的是来源信息与审计线索
  • attendance_device_tracking 决定的是要不要留这些痕迹
  • _attendance_action_change() 则只是把这些信息写进签到 / 签退记录

所以正确理解应该是:

PIN 更像认证层,device / geolocation 更像审计层,而不是地理门禁层。


为什么很多人会误以为它是“定位打卡”

因为界面上确实会出现这些元素:

  • kiosk 模式
  • 员工 PIN
  • 设备追踪开关
  • latitude / longitude
  • IP、browser、location

从业务感觉上,很容易脑补成:

  • 人必须在指定地点
  • 超出范围就不让打
  • 系统会替你做围栏风控

但控制器里的真实顺序不是这个逻辑。


manual_selection() 真正强校验的是 PIN,不是地理位置

公开 kiosk 下最关键的方法之一是:

  • manual_selection(token, employee_id, pin_code, latitude=False, longitude=False)

它真正决定是否执行 _attendance_action_change() 的条件是:

  • 员工属于当前公司
  • 公司不开 PIN,或者 员工 pin == pin_code

也就是说,纬度和经度虽然能传进来,但它们并没有被这里拿来做“允许 / 禁止”判断。

这一点非常关键。

系统现在做的是:

  • 先判断你是不是这个公司的人
  • 再判断如果公司要求 PIN,你有没有输对
  • 然后才把地理信息作为附带上下文记下来

所以 geolocation 在这里更像“记录”,不是“门槛”。


_get_geoip_response() 的设计明显偏向“留痕”

控制器里 _get_geoip_response() 组装的字段包括:

  • mode
  • location
  • latitude
  • longitude
  • ip_address
  • browser

如果 device_tracking_enabled 关闭,它甚至直接只返回:

  • mode

这说明官方设计重点是:

  • 可选地采集设备 / 来源信息
  • 采不到时也不阻止打卡主链路
  • 核心动作仍然可以继续

换句话说,如果它真想把 geolocation 当硬门禁,逻辑通常会长成:

  • 没坐标就拒绝
  • 超出范围就拒绝
  • 定位失败就阻止提交

而当前控制器并不是这么写的。


_attendance_action_change() 也在说明:这些信息是附加字段

_attendance_action_change() 收到 geo_information 后,会把它们展开成:

  • in_mode
  • in_location
  • in_latitude
  • in_longitude
  • in_ip_address
  • in_browser

签退时也对应写入 out_* 字段。

这非常像什么?

事件日志 enrich,不是 access control engine。

它在说:

  • 我把打卡动作记下来
  • 顺便把来源上下文也记下来
  • 以后若有争议,你们可以回头审计

所以这更接近“谁、何时、从哪类终端、带着什么上下文打了卡”,而不是“系统先做一轮地理围栏决策再决定放不放行”。


Device tracking 为什么重要,但也不是万能防线

device tracking 的价值并不是“绝对阻止作弊”,而是:

  • 让签到事件多一层证据
  • 让异常案例更容易复盘
  • 让 HR 在争议时不至于只剩一句“系统显示已打卡”

它能帮助发现的问题通常是:

  • 同一浏览器 / 设备连续替多人打卡
  • 异常来源模式(kiosk vs systray)
  • 看似人在办公室,实际来自别的网络来源

但它仍然不是万能。

因为留痕系统回答的是“发生时留下了什么痕迹”,不是“从物理世界上绝对证明就是本人”。


那 Odoo 为什么不直接把 geolocation 做成硬门禁

因为一旦做成硬门禁,会立刻碰到大量现实问题:

  • 公共设备不一定稳定拿到精确坐标
  • 浏览器权限经常被用户拒绝
  • 室内定位本来就可能飘
  • VPN、代理、内网出口会让 IP 地理定位失真
  • 公司有多办公点、多仓、多门岗

所以官方更稳的策略通常是:

  • 让 PIN 去解决“是不是你本人”
  • 让 token / company 边界解决“是不是这家公司终端”
  • 让 device / geolocation 去增强可审计性

这比硬性依赖坐标更符合真实部署环境。


这对实施有什么直接提醒

1)不要把 Odoo Kiosk 当门禁替代品

它是考勤入口,不是物理门禁系统。

2)如果你们关心代打卡,优先看 PIN 策略

因为在公开 kiosk 下,PIN 才是直接进入校验分支的控制条件。

3)如果你们关心争议追溯,别轻易关掉 device tracking

关掉后,审计证据会明显变薄。

4)如果你们真的需要地理围栏,要承认这是二次开发需求

不要假设 Odoo 开箱就已经替你做完。


我会怎么跟业务方解释

如果业务方问:

“既然有经纬度和设备信息,为什么不能直接当定位门禁?”

我会说:

因为 Odoo 当前把这些字段设计成签到上下文,不是准入规则。PIN 决定的是身份确认,设备和 geolocation 决定的是事后能不能说清楚这次打卡来自哪里。


一句话记忆

Odoo Kiosk 里的 PIN 是认证层,device tracking 和 geolocation 是审计层;它们能增强可信度,但默认不是硬门禁。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。