diff --git a/web/middleware/role_required.go b/web/middleware/role_required.go new file mode 100644 index 00000000..d0919c77 --- /dev/null +++ b/web/middleware/role_required.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +// RoleRequired проверяет, есть ли у пользователя нужная роль. +func RoleRequired(roles ...string) gin.HandlerFunc { + allowed := make(map[string]bool) + for _, r := range roles { + allowed[r] = true + } + return func(c *gin.Context) { + roleVal, exists := c.Get("role") // где-то до этого роль должна быть положена в контекст + if !exists { + c.AbortWithStatus(http.StatusUnauthorized) + return + } + role, ok := roleVal.(string) + if !ok || !allowed[role] { + c.AbortWithStatus(http.StatusForbidden) + return + } + c.Next() + } +}