54 lines
1.5 KiB
Markdown
54 lines
1.5 KiB
Markdown
# 接口鉴权工具(中间件)
|
||
|
||
|
||
1. 路有装饰, 路有配置
|
||
```go
|
||
// required_auth=true/false
|
||
// required_auth=true/false
|
||
ws.Route(ws.GET("").To(h.QueryUser).
|
||
Doc("用户列表查询").
|
||
Metadata(restfulspec.KeyOpenAPITags, tags).
|
||
// 这个开关怎么生效
|
||
// 中间件需求读取接口的描述信息,来决定是否需要认证
|
||
Metadata(permission.Auth(true)).
|
||
Metadata(permission.Permission(true)).
|
||
Metadata(permission.Resource("user")).
|
||
Metadata(permission.Action("list")).
|
||
Param(restful.QueryParameter("page_size", "分页大小").DataType("integer")).
|
||
Param(restful.QueryParameter("page_number", "页码").DataType("integer")).
|
||
Writes(Set{}).
|
||
Returns(200, "OK", Set{}))
|
||
```
|
||
|
||
2. 加载鉴权处理逻辑(中间件)
|
||
|
||
|
||
```go
|
||
// 中间件的函数里面
|
||
func (c *Checker) Check(r *restful.Request, w *restful.Response, next *restful.FilterChain) {
|
||
// 请求处理前, 对接口进行保护
|
||
// 1. 知道用户当前访问的是哪个接口, 当前url 匹配到的路由是哪个
|
||
// SelectedRoute, 它可以返回当前URL适配哪个路有, RouteReader
|
||
// 封装了一个函数 来获取Meta信息 NewEntryFromRestRouteReader
|
||
route := endpoint.NewEntryFromRestRouteReader(r.SelectedRoute())
|
||
if route.RequiredAuth {
|
||
// 校验身份
|
||
tk, err := c.CheckToken(r)
|
||
if err != nil {
|
||
response.Failed(w, err)
|
||
return
|
||
}
|
||
|
||
// 校验权限
|
||
if err := c.CheckPolicy(r, tk, route); err != nil {
|
||
response.Failed(w, err)
|
||
return
|
||
}
|
||
}
|
||
|
||
// 请求处理
|
||
next.ProcessFilter(r, w)
|
||
|
||
// 请求处理后
|
||
}
|
||
``` |