middleware_auth.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package middleware
  2. import (
  3. "demo/internal/dao"
  4. "demo/internal/model/do"
  5. "demo/internal/model/entity"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/net/ghttp"
  8. "github.com/gogf/gf/v2/os/gtime"
  9. "net/http"
  10. )
  11. // HandlerAuth 接入剑鱼后台现有的权限控制
  12. func HandlerAuth(r *ghttp.Request) {
  13. token_ := r.Request.URL.Query().Get("_token")
  14. // todo 待优化
  15. // 验证token有效
  16. da := dao.AdminToken
  17. orm := da.Ctx(r.Context())
  18. token := entity.AdminToken{}
  19. err := orm.Where(da.Columns().Token, token_).Scan(&token)
  20. if err != nil || gtime.Now().After(token.ExpireTime) {
  21. r.Response.WriteStatus(http.StatusForbidden)
  22. return
  23. }
  24. user := entity.AdminUser{}
  25. // 验证用户有效
  26. err = dao.AdminUser.Ctx(r.Context()).Where(dao.AdminUser.Columns().Id, token.AdminUserId).Scan(&user)
  27. if err != nil || user.Status == 2 {
  28. r.Response.WriteStatus(http.StatusForbidden)
  29. return
  30. }
  31. r.SetCtxVar("admin_user_id", token.AdminUserId)
  32. // 获得请求id 验证请求有效
  33. adminReq := entity.AdminRequest{}
  34. // todo 因为这是 restful风格的接口 ,和剑鱼后台原有的权限判断不一致,所以在不调整表结构的情况下使用原call字段 充当请求方式字段 在页面是`类型配置`输入框
  35. // 后边有时间可以看一下怎么调整一下
  36. err = dao.AdminRequest.Ctx(r.Context()).Where(do.AdminRequest{Action: r.Router.Uri, Call: r.Method}).Scan(&adminReq)
  37. if err != nil {
  38. r.Response.WriteStatus(http.StatusBadRequest)
  39. return
  40. }
  41. 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()
  42. if err != nil || !exist {
  43. r.Response.WriteStatus(http.StatusNotImplemented)
  44. return
  45. }
  46. // token续期
  47. //在验证过token是否过期后为token续期
  48. renew := token.ExpireTime.AddDate(0, 0, -1)
  49. if renew.Before(gtime.Now()) {
  50. _, err = orm.Data(da.Columns().ExpireTime, token.ExpireTime.AddDate(0, 0, 2)).Where(da.Columns().Id, token.Id).Update()
  51. if err != nil {
  52. g.Log().Error(r.Context(), "token 续期失败", err)
  53. }
  54. }
  55. r.Middleware.Next()
  56. }