Compare commits

...

4 Commits
v0.1.2 ... main

Author SHA1 Message Date
8d3b1b71e5
update example 2024-05-04 09:43:20 +03:00
e9cbcb04c4
update logic 2023-10-30 17:31:06 +03:00
7a03599d16
remove path 2023-10-30 17:03:25 +03:00
cabcbbb166
update logic and logging 2023-10-30 16:53:34 +03:00
2 changed files with 30 additions and 17 deletions

View File

@ -11,6 +11,5 @@ testData:
- userId1
- userId2
paths:
- prefix: /v1/users
mustContain: testValue
- prefix: /v1/organizations
- base: /v1/users
path: /testValue

42
main.go
View File

@ -8,9 +8,13 @@ import (
"strings"
)
type Rule struct {
AllowedSubPaths []string `json:"allowedSubPaths,omitempty"`
}
type Path struct {
Prefix string `json:"prefix,omitempty"`
MustContain string `json:"mustContain,omitempty"`
Path string `json:"base,omitempty"`
Rule Rule `json:"rule,omitempty"`
}
type Config struct {
@ -38,8 +42,8 @@ func New(ctx context.Context, next http.Handler, config *Config, name string) (h
}
for _, path := range config.Paths {
if path.Prefix == "" {
return nil, fmt.Errorf("Paths.Prefix cannot be empty")
if path.Path == "" {
return nil, fmt.Errorf("Paths.Path cannot be empty")
}
}
@ -54,11 +58,8 @@ func New(ctx context.Context, next http.Handler, config *Config, name string) (h
func (a *UsersBlocker) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
userId := req.Header["X-Auth-User-Id"][0]
os.Stdout.WriteString("\n request Path ->")
os.Stdout.WriteString(req.URL.Path + "\n")
os.Stdout.WriteString("\n userId ->")
os.Stdout.WriteString(userId + "\n")
message := fmt.Sprintf("{requestPath: %s, userId: %s}\n", req.URL.Path, userId)
os.Stdout.WriteString(message)
var isUserBlocked bool
@ -74,16 +75,29 @@ func (a *UsersBlocker) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
}
for _, path := range a.paths {
isPathBlocked := strings.HasPrefix(req.URL.Path, path.Prefix)
isPathMatched := strings.HasPrefix(req.URL.Path, path.Path)
if isPathBlocked && path.MustContain != "" {
isPathBlocked = !strings.Contains(req.URL.Path, path.MustContain)
if !isPathMatched {
a.next.ServeHTTP(rw, req)
return
}
if isPathBlocked {
http.Error(rw, "Forbidden", http.StatusForbidden)
if len(path.Rule.AllowedSubPaths) == 0 {
message := fmt.Sprintf("blocked path %s (matched with %s) for user %s", req.URL.Path, path.Path, userId)
os.Stdout.WriteString(message)
http.Error(rw, message, http.StatusForbidden)
return
}
for _, allowedSubPath := range path.Rule.AllowedSubPaths {
isAllowedSubPathMatched := strings.HasPrefix(req.URL.Path, path.Path+allowedSubPath)
if !isAllowedSubPathMatched {
message := fmt.Sprintf("blocked path %s (matched with %s) for user %s", req.URL.Path, path.Path+path.Path+allowedSubPath, userId)
os.Stdout.WriteString(message)
http.Error(rw, message, http.StatusForbidden)
return
}
}
}
a.next.ServeHTTP(rw, req)