先说结论
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() 组装的字段包括:
modelocationlatitudelongitudeip_addressbrowser
如果 device_tracking_enabled 关闭,它甚至直接只返回:
mode
这说明官方设计重点是:
- 可选地采集设备 / 来源信息
- 采不到时也不阻止打卡主链路
- 核心动作仍然可以继续
换句话说,如果它真想把 geolocation 当硬门禁,逻辑通常会长成:
- 没坐标就拒绝
- 超出范围就拒绝
- 定位失败就阻止提交
而当前控制器并不是这么写的。
_attendance_action_change() 也在说明:这些信息是附加字段
_attendance_action_change() 收到 geo_information 后,会把它们展开成:
in_modein_locationin_latitudein_longitudein_ip_addressin_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
评论区