62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package middleware
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								import (
							 | 
						|||
| 
								 | 
							
									"github.com/casbin/casbin/v2/util"
							 | 
						|||
| 
								 | 
							
									"net/http"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									"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
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
										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
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								}
							 |