photum/backend/internal/auth/middleware.go
JoaoVitorMS0 93d603da6c feat: implementa visualização de agenda para profissionais e melhorias no sistema
- Adiciona role 'agenda_viewer' para profissionais visualizarem apenas suas agendas
- Implementa middleware de autorização baseado em roles
- Adiciona validação de permissões nos endpoints de agenda
- Melhora exibição de dados financeiros e logísticos
- Atualiza componentes frontend para melhor UX
- Adiciona documentação sobre o papel de visualização de agenda
2026-01-19 17:06:27 -03:00

71 lines
1.9 KiB
Go

package auth
import (
"net/http"
"strings"
"photum-backend/internal/config"
"github.com/gin-gonic/gin"
)
func AuthMiddleware(cfg *config.Config) gin.HandlerFunc {
return func(c *gin.Context) {
authHeader := c.GetHeader("Authorization")
var tokenString string
if authHeader != "" {
parts := strings.Split(authHeader, " ")
if len(parts) == 2 && parts[0] == "Bearer" {
tokenString = parts[1]
} else if len(parts) == 1 && parts[0] != "" {
tokenString = parts[0]
} else {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid authorization header format"})
return
}
} else {
// Try to get from cookie
cookie, err := c.Cookie("access_token")
if err == nil && cookie != "" {
tokenString = cookie
} else {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "authorization header required"})
return
}
}
claims, err := ValidateToken(tokenString, cfg.JwtAccessSecret)
if err != nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
return
}
c.Set("userID", claims.UserID.String())
c.Set("role", claims.Role)
c.Next()
}
}
// RequireWriteAccess middleware to prevent AGENDA_VIEWER from modifying data
func RequireWriteAccess() gin.HandlerFunc {
return func(c *gin.Context) {
role := c.GetString("role")
if role == "AGENDA_VIEWER" {
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "você não tem permissão para modificar dados"})
return
}
c.Next()
}
}
// RequireLogisticsAccess middleware to prevent AGENDA_VIEWER from accessing logistics
func RequireLogisticsAccess() gin.HandlerFunc {
return func(c *gin.Context) {
role := c.GetString("role")
if role == "AGENDA_VIEWER" {
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "você não tem permissão para acessar logística"})
return
}
c.Next()
}
}