12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package middleware
- import (
- "demo/internal/dao"
- "demo/internal/model/do"
- "demo/internal/model/entity"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/gogf/gf/v2/net/ghttp"
- "github.com/gogf/gf/v2/os/gtime"
- "net/http"
- )
- // HandlerAuth 接入剑鱼后台现有的权限控制
- func HandlerAuth(r *ghttp.Request) {
- token_ := r.Request.URL.Query().Get("_token")
- // todo 待优化
- // 验证token有效
- da := dao.AdminToken
- orm := da.Ctx(r.Context())
- token := entity.AdminToken{}
- err := orm.Where(da.Columns().Token, token_).Scan(&token)
- if err != nil || gtime.Now().After(token.ExpireTime) {
- r.Response.WriteStatus(http.StatusForbidden)
- return
- }
- user := entity.AdminUser{}
- // 验证用户有效
- err = dao.AdminUser.Ctx(r.Context()).Where(dao.AdminUser.Columns().Id, token.AdminUserId).Scan(&user)
- if err != nil || user.Status == 2 {
- r.Response.WriteStatus(http.StatusForbidden)
- return
- }
- r.SetCtxVar("admin_user_id", token.AdminUserId)
- // 获得请求id 验证请求有效
- adminReq := entity.AdminRequest{}
- // todo 因为这是 restful风格的接口 ,和剑鱼后台原有的权限判断不一致,所以在不调整表结构的情况下使用原call字段 充当请求方式字段 在页面是`类型配置`输入框
- // 后边有时间可以看一下怎么调整一下
- err = dao.AdminRequest.Ctx(r.Context()).Where(do.AdminRequest{Action: r.URL.Path, Call: r.Method}).Scan(&adminReq)
- if err != nil {
- r.Response.WriteStatus(http.StatusBadRequest)
- return
- }
- exist, err := orm.Raw("SELECT * FROM cadmin.admin_user_relate aur ,admin_user_group_relate augr ,admin_request_relate arr where arr.admin_request_id=? and aur.admin_user_id=? and augr.admin_user_group_id=aur.admin_user_group_id and augr.admin_auth_id=arr.admin_auth_id ", adminReq.Id, token.AdminUserId).Exist()
- if err != nil || !exist {
- r.Response.WriteStatus(http.StatusNotImplemented)
- return
- }
- // token续期
- //在验证过token是否过期后为token续期
- renew := token.ExpireTime.AddDate(0, 0, -1)
- if renew.Before(gtime.Now()) {
- _, err = orm.Data(da.Columns().ExpireTime, token.ExpireTime.AddDate(0, 0, 2)).Where(da.Columns().Id, token.Id).Update()
- if err != nil {
- g.Log().Error(r.Context(), "token 续期失败", err)
- }
- }
- r.Middleware.Next()
- }
|