12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package middleware
- import (
- "net/http"
- "github.com/casbin/casbin/v2/util"
- "github.com/gin-gonic/gin"
- "github.com/go-admin-team/go-admin-core/sdk"
- "github.com/go-admin-team/go-admin-core/sdk/api"
- "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
- "github.com/go-admin-team/go-admin-core/sdk/pkg/response"
- )
- // AuthCheckRole 权限检查中间件
- func AuthCheckRole() gin.HandlerFunc {
- return func(c *gin.Context) {
- log := api.GetRequestLogger(c)
- data, _ := c.Get(jwtauth.JwtPayloadKey)
- v := data.(jwtauth.MapClaims)
- e := sdk.Runtime.GetCasbinKey(c.Request.Host)
- var res, casbinExclude bool
- var err error
- //检查权限
- if v["rolekey"] == "admin" {
- res = true
- c.Next()
- return
- }
- //TODO: 临时使用,需要调整sys_api对接口的管理
- if v["rolekey"] == "normal" {
- res = true
- c.Next()
- return
- }
- if v["rolekey"] == "abnormal" {
- res = true
- c.Next()
- return
- }
- for _, i := range CasbinExclude {
- if util.KeyMatch2(c.Request.URL.Path, i.Url) && c.Request.Method == i.Method {
- casbinExclude = true
- break
- }
- }
- if casbinExclude {
- log.Infof("Casbin exclusion, no validation method:%s path:%s", c.Request.Method, c.Request.URL.Path)
- c.Next()
- return
- }
- res, err = e.Enforce(v["rolekey"], c.Request.URL.Path, c.Request.Method)
- if err != nil {
- log.Errorf("AuthCheckRole error:%s method:%s path:%s", err, c.Request.Method, c.Request.URL.Path)
- response.Error(c, 500, err, "")
- return
- }
- if res {
- log.Infof("isTrue: %v role: %s method: %s path: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path)
- c.Next()
- } else {
- log.Warnf("isTrue: %v role: %s method: %s path: %s message: %s", res, v["rolekey"], c.Request.Method, c.Request.URL.Path, "当前request无权限,请管理员确认!")
- c.JSON(http.StatusOK, gin.H{
- "code": 403,
- "msg": "对不起,您没有该接口访问权限,请联系管理员",
- })
- c.Abort()
- return
- }
- }
- }
|