svn服务端需借助apache和底层认证机制实现密码定期过期:apache+mysql方案通过扩展用户表字段及修改sql查询判断有效期;apache+htpasswd方案依赖脚本校验与外部认证模块;必须配套自助改密页、友好错误提示和管理员应急通道,并注意时区、日志审计等细节。

SVN服务端本身不支持密码定期过期功能,必须借助其运行环境(如Apache)和底层认证机制来实现。核心思路是:把密码有效期逻辑下推到认证后端(例如数据库或htpasswd文件),并在用户登录时由Apache在验证阶段一并检查是否过期。
使用Apache + MySQL实现密码过期检查
适用于已用mod_authn_dbd连接MySQL管理用户的场景:
- 在用户表中新增字段last_pwd_change(DATETIME类型),记录每次修改密码的时间
- 修改Apache的AuthDBDUserPWQuery语句,加入有效期判断(如90天):
SELECT password FROM users WHERE username = %s AND last_pwd_change > DATE_SUB(NOW(), INTERVAL 90 DAY) - 若查询无结果(即过期),Apache会直接返回401 Unauthorized,用户无法登录,只能通过其他途径重置密码
- 配套提供自助改密页面,确保用户能更新密码并同步写入last_pwd_change字段
使用Apache + htpasswd文件配合脚本检查
适用于小型部署、用户量不大、密码存于htpasswd文件的场景:
- 为每个用户额外维护一个pwd_expires文件(如CSV格式:username,expire_date),或扩展脚本解析htpasswd行并嵌入时间戳(需自定义加密格式)
- 编写Perl/Python CGI脚本,在Apache认证前调用该脚本校验用户密码+过期状态;可复用htpasswd -v验证密码,再查对应过期时间
- 将认证方式从Basic改为Script,用AuthType Script(需启用mod_authnz_external)或通过RewriteRule前置跳转校验
- 用户首次登录失败后,自动跳转至自助改密页,改密成功则更新过期时间
强制修改流程必须配套的用户侧支持
仅设限不提供出口,会导致服务中断。以下三项缺一不可:
- 自助改密网页:部署在同域名下(如/svn/changepwd),前端表单收集旧密码、新密码,后端调用htpasswd -b或更新数据库,并刷新last_pwd_change
- 清晰的错误提示:Apache返回401时,可通过ErrorDocument指令指向定制HTML页,提示“密码已过期,请点击此处修改”
- 管理员应急通道:保留命令行快速重置能力(如htpasswd -b /path/to/passwd user newpass),避免自助系统故障时全员锁死
注意事项与常见陷阱
实际部署中容易忽略的关键点:
- Apache配置中Require valid-user必须保留,否则过期用户可能绕过检查直接访问
- 数据库查询若含NOW()函数,需确认服务器时区与业务预期一致(建议统一设为UTC或东八区)
- htpasswd方案中,不能依赖文件修改时间(mtime)代替逻辑过期时间——用户可能只读取不改密,mtime不会变
- 所有密码相关操作日志必须记录(谁、何时、IP、成功与否),便于审计与排查











