Skip to content

[Bug] v1.5.2 修改密码接口被 /user/{user_id} 路由遮蔽,PUT /user/password 返回 404 #453

Description

@nurtwong

环境:

  • 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 此次可以稳定复现为路由匹配顺序问题。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions