diff --git a/README.md b/README.md index 6a46966..8baf769 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,10 @@ TODO LIST *Настроить авторизацию по уровню доступа. уровни доступа нужно настроить через jwt token. 1. Создать клаймс которые хранят уровень доступа. -2. Создать хендлерсы которые будут обрабатывать каждый уровень достпа. +2. Создать хендлерсы которые будут обрабатывать каждый уровень доступа. 3. Прописть роутинг согласно уроням доспуа к каждому урлу. (лучше поделить на группы и в каждой группе прописать миддлваре с соответствующим обработчиком хендлерсом.) +23.08.2024. +создан миддле варе, package auth/ authAdminMiddlware нужно проверить роботостпособность. Протестировать. + *Добавление обьектов. \ No newline at end of file diff --git a/api/src/initializers/Routing.go b/api/src/initializers/Routing.go index 5be93d1..1bbfd7e 100644 --- a/api/src/initializers/Routing.go +++ b/api/src/initializers/Routing.go @@ -50,7 +50,11 @@ func InitChiRouting() { r.Group(func(r chi.Router) { r.Use(auth.AuthMiddleware) r.Get("/profile", prf.Profile) - r.Get("/allUsers", admin.GetAllUser) // all users get + r.Get("/allUsersAdm", admin.GetAllUser) + r.Route("/admin", func(r chi.Router) { + r.Use(auth.AuthAdminMiddleware) + r.Get("/allUsersAdm", admin.GetAllUser) // all users get + }) }) // up server on os.Getenv("SERVER_PORT") port on gorutin diff --git a/api/src/models/authDataStructs.go b/api/src/models/authDataStructs.go index 69e7f04..fc4c885 100644 --- a/api/src/models/authDataStructs.go +++ b/api/src/models/authDataStructs.go @@ -15,4 +15,5 @@ type Claims struct { jwt.RegisteredClaims Email string `json:"email"` Phone string `json:"phone"` + Role string `json:"role"` } \ No newline at end of file diff --git a/api/src/rt/admin/authAdminMiddlware.go b/api/src/rt/admin/authAdminMiddlware.go deleted file mode 100644 index 8488cc1..0000000 --- a/api/src/rt/admin/authAdminMiddlware.go +++ /dev/null @@ -1,9 +0,0 @@ -package admin - -import "net/http" - -func AuthAdminMiddleware(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusUnauthorized) - }) -} \ No newline at end of file diff --git a/api/src/rt/admin/users.go b/api/src/rt/admin/users.go index 626ea06..174bd21 100644 --- a/api/src/rt/admin/users.go +++ b/api/src/rt/admin/users.go @@ -24,4 +24,4 @@ func GetAllUser(w http.ResponseWriter, r *http.Request) { w.Write([]byte(jsData)) -} +} \ No newline at end of file diff --git a/api/src/rt/auth/authAdminMiddlware.go b/api/src/rt/auth/authAdminMiddlware.go new file mode 100644 index 0000000..c761e50 --- /dev/null +++ b/api/src/rt/auth/authAdminMiddlware.go @@ -0,0 +1,50 @@ +package auth + +import ( + "api/src/models" + "context" + "net/http" + + "github.com/golang-jwt/jwt/v4" +) + +func AuthAdminMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + c, err := r.Cookie("token") + if err != nil { + if err == http.ErrNoCookie { + w.WriteHeader(http.StatusUnauthorized) + return + } + w.WriteHeader(http.StatusBadRequest) + return + } + + tknStr := c.Value + claims := &models.Claims{} + + tkn, err := jwt.ParseWithClaims(tknStr, claims, func(token *jwt.Token) (interface{}, error) { + return jwtKey, nil + }) + + if err != nil { + if err == jwt.ErrSignatureInvalid { + w.WriteHeader(http.StatusUnauthorized) + return + } + w.WriteHeader(http.StatusBadRequest) + return + } + if !tkn.Valid { + w.WriteHeader(http.StatusUnauthorized) + return + } + + if claims.Role != "Admin" { + w.WriteHeader(http.StatusNonAuthoritativeInfo) + return + } + ctx := context.WithValue(r.Context(), "email", claims.Email) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +}