mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 21:41:55 +00:00
76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package middleware
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// RequirePermissions ensures the authenticated user possesses all specified permissions.
|
|
func RequirePermissions(perms ...string) fiber.Handler {
|
|
required := canonicalPermissions(perms)
|
|
return func(c *fiber.Ctx) error {
|
|
if len(required) == 0 {
|
|
return c.Next()
|
|
}
|
|
|
|
ctx, ok := AuthDetails(c)
|
|
if !ok || ctx == nil {
|
|
return fiber.NewError(fiber.StatusUnauthorized, "Please authenticate")
|
|
}
|
|
|
|
userPerms := ctx.permissionSet()
|
|
if len(userPerms) == 0 {
|
|
return fiber.NewError(fiber.StatusForbidden, "Insufficient permission")
|
|
}
|
|
|
|
for _, perm := range required {
|
|
if _, has := userPerms[perm]; !has {
|
|
return fiber.NewError(fiber.StatusForbidden, "Insufficient permission")
|
|
}
|
|
}
|
|
|
|
return c.Next()
|
|
}
|
|
}
|
|
|
|
// HasPermission reports whether the current request context includes the given permission.
|
|
func HasPermission(c *fiber.Ctx, perm string) bool {
|
|
ctx, ok := AuthDetails(c)
|
|
if !ok || ctx == nil {
|
|
return false
|
|
}
|
|
perm = canonicalPermission(perm)
|
|
if perm == "" {
|
|
return false
|
|
}
|
|
_, has := ctx.permissionSet()[perm]
|
|
return has
|
|
}
|
|
|
|
func (a *AuthContext) permissionSet() map[string]struct{} {
|
|
if a == nil || a.Permissions == nil {
|
|
return nil
|
|
}
|
|
return a.Permissions
|
|
}
|
|
|
|
func canonicalPermissions(perms []string) []string {
|
|
out := make([]string, 0, len(perms))
|
|
seen := make(map[string]struct{}, len(perms))
|
|
for _, perm := range perms {
|
|
if canonical := canonicalPermission(perm); canonical != "" {
|
|
if _, ok := seen[canonical]; ok {
|
|
continue
|
|
}
|
|
seen[canonical] = struct{}{}
|
|
out = append(out, canonical)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func canonicalPermission(perm string) string {
|
|
return strings.ToLower(strings.TrimSpace(perm))
|
|
}
|