refactor: config + lldaplib 收敛到 LLDAP 形态(读只读、删 OpenLDAP 写路径与密码包)

- config 重写:删 user-ou/inactive-ou/group-root-* / group-object-class /
  group-member-attr / initial-password;新增 lldap 写通道 + webhook + confirm-base-url
  + 两套 schedule + guard
- ldaplib 收拢为只读:属性常量/DN 归入 attrs.go;删 ops.go 写路径与 internal/password
- config.example.yml 重写成 LLDAP 形态
- 组命名修订(呼应 AGENTS.md 约束12):用部门稳定索引 cn=<dept_id> 做组身份,
  mirror_departments 增 group_id 列并跨快照保留,可读中文名只走 DB 展示
This commit is contained in:
2026-09-29 23:48:49 +08:00
parent 10ed3984dc
commit 979a98d502
16 changed files with 387 additions and 1031 deletions
+38 -31
View File
@@ -1,74 +1,81 @@
# idsync 配置示例。复制为 config.yml 后按实际环境修改。
#
# 注意:本工具不参与认证链路,用户登录、密码重置、发信全部由 Authelia 负责。
# 它只把飞书通讯录物化到 OpenLDAP,因此这里没有也不需要任何认证相关配置。
# 两阶段架构:飞书 → SQLite 镜像 → LLDAP。
# - 快照:低频(默认每天一次),飞书 → 镜像 + 离职流程推进。
# - 物化:略高频(默认每 2–4 小时一次),镜像在职视图 → LLDAP(写走 GraphQL)。
# 本工具不参与认证链路:用户登录/密码重置/发信由 Authelia 负责,因此这里没有
# 认证相关配置,只有数据管道的调度与通道配置。
system:
# debug 会输出更详细的日志;生产环境用 release
mode: release
# 台账数据库与运行数据目录
# 镜像数据库与运行数据目录
data-dir: data
server:
listen: 0.0.0.0:8899
# 管理界面自身的登录凭据(仅用于保护这个界面,与 LDAP 用户无关)
# 管理界面自身的登录凭据(仅保护界面,与 LDAP 用户无关)
admin-user: admin
# 明文密码只在首次启动时用于生成哈希;建议改用 hash-password 生成下面的哈希
admin-password: change-me
# 用 `./idsync -hash-password '你的密码'` 生成,留空则使用上面的明文密码
admin-password-hash: ""
# 会话签名密钥,用 `./idsync -gen-secret` 生成。
# 留空会自动生成临时密钥,但重启后需要重新登录。
# 会话签名密钥,用 `./idsync -gen-secret` 生成。留空会自动生成临时密钥
session-secret: ""
# 经 HTTPS 反代访问时设为 true
secure-cookie: false
# 离职确认端点的对外 base-url;必须是公网/反代可达地址。飞书离职卡片的
# 「确认离职」按钮 url 用它拼接,因此该项缺失时卡片将无法提供确认入口。
confirm-base-url: "https://idsync.example.com"
feishu:
app-id: "cli_xxxxxxxxxxxx"
app-secret: "xxxxxxxxxxxxxxxxxxxxxxxx"
# 留空使用飞书开放平台;Lark 国际版填 https://open.larksuite.com
base-url: ""
# 留空表示同步全部部门;填部门 ID 则只同步这些部门,
# 前缀 ^ 表示排除该部门及其子部门(例如 ["^odxxxx"])
# 留空表示同步全部部门;填部门 ID 则只同步这些部门,前缀 ^ 表示排除
dept-list: []
# 调用飞书的速率上限(次/秒),避免触发频控
qps: 5
timeout-sec: 30
# 离职确认卡片「自定义机器人」的 webhook 地址,发给用户管理群
webhook-url: "https://open.feishu.cn/open-apis/bot/v2/hook/xxxx"
ldap:
# 生产环境务必使用 ldaps:// 或开启 start-tls:
# LLDAP 的 LDAP 读通道(连接/搜索)。生产建议 ldaps:// 或开启 start-tls:
# Authelia 重置密码时会把新密码经此连接发送。
url: ldaps://ldap.example.com:636
url: "ldaps://lldap.example.com:6360"
base-dn: "dc=example,dc=com"
admin-dn: "cn=admin,dc=example,dc=com"
# LLDAP 管理员用户(固定挂在 ou=people 下)
admin-dn: "uid=admin,ou=people,dc=example,dc=com"
admin-pass: "change-me"
# 在职用户所在 OU。必须落在 Authelia 的 base_dn 之内。
user-ou: "ou=people"
# 离职用户迁往的 OU。必须落在 Authelia 的 base_dn 之外,
# 这样离职者会自动失去登录能力,无需在 Authelia 侧加过滤条件。
inactive-ou: "ou=Inactive"
# 部门树根 OU 的名称(仅名称,不含 ou=)
group-root-name: "feishuroot"
timeout-sec: 15
start-tls: false
# 仅自签证书的测试环境使用
insecure-skip-verify: false
# 新建用户的初始密码。留空则每个用户随机生成,
# 用户首次登录应走 Authelia 的“忘记密码”自助重置。
initial-password: ""
lldap:
# LLDAP 的 GraphQL 写通道地址(WebUI/GraphQL 端口)
base-url: "http://lldap:17170"
admin-user: admin
admin-pass: "change-me"
database:
source: data/idsync.db
sync:
# 是否启用定时同步
schedule:
# 是否启用定时任务
enable: true
# 秒级 cron:秒 分 时 日 月 周。默认每天 00:40 执行。
schedule: "0 40 0 * * *"
# true 表示定时任务只生成计划不写入。建议先观察几轮再改为 false。
default-dry-run: true
# 单次同步允许停用的账号数上限,0 表示不限制
# 快照 cron(秒级):低频,默认每天 00:20
snapshot: "0 20 0 * * *"
# 物化 cron(秒级):略高频,默认每 2 小时 30 分
sync: "0 30 */2 * * *"
# 物化是否默认 dry-run。快照永远直接落库;建议先观察几轮物化计划再放开。
sync-dry-run: true
guard:
# 单次物化允许删除(离职确认后)的账号数上限,0 表示不限制
max-deactivate: 0
# 单次同步允许停用的账号比例上限(0-1)。
# 用于防止飞书应用权限范围被误改导致大批账号被判定为离职。
max-deactivate-percent: 0.2
# 单次物化允许删除的账号比例上限(0-1)。
# 防止飞书应用权限被误改导致大批账号被判定为离职。
max-deactivate-percent: 0.2