user
API
user的API有如下几个:
GET /users
POST /users
GET /users/current
PUT /users/{user_id}
DELETE /users/{user_id}
PUT /users/{user_id}/password
PUT /users/{user_id}/sysadmin
以上七个API匹配以下三行代码中的路由:
beego.Router("/api/users/?:id", &api.UserAPI{})
beego.Router("/api/users/:id([0-9]+)/password", &api.UserAPI{}, "put:ChangePassword")
beego.Router("/api/users/:id/sysadmin", &api.UserAPI{}, "put:ToggleUserAdminRole")
由此可以看出,user的API请求都在UserAPI这个结构体中,该结构体定义在/api/user.go当中。
结构体
type UserAPI struct {
api.BaseAPI // 继承了beego.Controller
currentUserID int // Header中的user
userID int // 路径参数 user_id
SelfRegistration bool // 是否支持用户自已注册,若为false则只能由管理员用户创建新的用户
IsAdmin bool // 是否为系统用户
AuthMode string // 授权模式:db
}
BaseAPI定义在/api/base.go文件中,如下:
type BaseAPI struct {
beego.Controller
}
获取及验证Header中的用户
首先,我们介绍一下UserAPI中的userID、currentUserID、IsAdmin等五个参数是如何获取的。UserAPI继承了baseAPI,而baseAPI实际上就是继承了beego.Controller。UserAPI重写了beego.Controller的Prepare()函数,该函数会在Get()、POST()等函数之前执行。
Prepare()函数的代码如下:
AuthMode:通过配置文件获取,对应第(3)行代码
SelfRegistration:通过配置文件获取,对应第(5)行代码
currentUserId:对应第(15)行代码,ValidateUser()函数是BaseAPI结构体的函数,该函数的分析见 BaseAPI.ValidateUser() 。
IsAdmin:对应第(39)行代码,得到currentUserId后,再从数据库查询该user是否为管理员用户
userId:对应第(16)行代码,从路径参数中获取。如果请求的URL为
API对应的处理函数
GET /users
根据router中的路由规则,该API对应UserAPI中的GET()方法,GET()方法的源码见下面。第(2)行代码中当 ua.userId == 0
成立时,表示请求的URL为/users
(可以通过Prepare()函数分析得出)。于是,我们只需要关注第一个if语句中的代码。在源代码的后面,本人做了简单的注释。
GET /users/current
根据router中的路由规则,该API也是对应UserAPI中的GET()方法,GET()方法的源码见下面。该URL对应的代码为Get()中的else if块,满足的条件为ua.userID == ua.currentUserID
(可以通过Prepare()函数分析得出)。于是,我们只需要关注相应的代码,该函数中的其他代码块已省略。在源代码的后面,本人做了简单的注释。
POST /users
start here
Last updated
Was this helpful?