环境:
- We-MP-RSS 1.5.2
- Docker
- API_BASE=/api/v1/wx
现象:
Web UI 中使用“修改密码”功能后,密码没有修改成功。
后端日志持续出现:
PUT /api/v1/wx/user/password HTTP/1.1" 404 Not Found
默认密码 admin@123 仍可重新登录。
排查发现:
apis/user.py 中路由顺序为:
183: @router.put("/{user_id}", summary="更新用户信息")
238: @router.delete("/{user_id}", summary="删除用户")
290: @router.post("/{user_id}/reset-password", summary="重置用户密码")
422: @router.put("/password", summary="修改密码")
运行时 FastAPI 路由表也是:
/api/v1/wx/user/{user_id} -> PUT
...
/api/v1/wx/user/password -> PUT
因此:
PUT /api/v1/wx/user/password
会先匹配:
PUT /api/v1/wx/user/{user_id}
即 user_id="password"。
随后 update_user_by_id() 查询不到 id="password" 的用户,因此返回 404,
真正的 change_password() 没有被调用。
FastAPI/Starlette 路由按声明顺序匹配,因此静态路由 /password
需要定义在动态路由 /{user_id} 之前。
建议修复:
将:
@router.put("/password")
移动到:
@router.put("/{user_id}")
之前。
或者采用不会与静态路径冲突的用户详情路由设计。
补充:
历史 Issue #91 曾出现“修改密码后仍使用默认密码”的类似现象,
但当前 v1.5.2 此次可以稳定复现为路由匹配顺序问题。
环境:
现象:
Web UI 中使用“修改密码”功能后,密码没有修改成功。
后端日志持续出现:
PUT /api/v1/wx/user/password HTTP/1.1" 404 Not Found
默认密码 admin@123 仍可重新登录。
排查发现:
apis/user.py 中路由顺序为:
183: @router.put("/{user_id}", summary="更新用户信息")
238: @router.delete("/{user_id}", summary="删除用户")
290: @router.post("/{user_id}/reset-password", summary="重置用户密码")
422: @router.put("/password", summary="修改密码")
运行时 FastAPI 路由表也是:
/api/v1/wx/user/{user_id} -> PUT
...
/api/v1/wx/user/password -> PUT
因此:
PUT /api/v1/wx/user/password
会先匹配:
PUT /api/v1/wx/user/{user_id}
即 user_id="password"。
随后 update_user_by_id() 查询不到 id="password" 的用户,因此返回 404,
真正的 change_password() 没有被调用。
FastAPI/Starlette 路由按声明顺序匹配,因此静态路由 /password
需要定义在动态路由 /{user_id} 之前。
建议修复:
将:
@router.put("/password")
移动到:
@router.put("/{user_id}")
之前。
或者采用不会与静态路径冲突的用户详情路由设计。
补充:
历史 Issue #91 曾出现“修改密码后仍使用默认密码”的类似现象,
但当前 v1.5.2 此次可以稳定复现为路由匹配顺序问题。