add authAdminMiddlware into package auth. Need test it
This commit is contained in:
@@ -4,7 +4,10 @@ TODO LIST
|
|||||||
*Настроить авторизацию по уровню доступа.
|
*Настроить авторизацию по уровню доступа.
|
||||||
уровни доступа нужно настроить через jwt token.
|
уровни доступа нужно настроить через jwt token.
|
||||||
1. Создать клаймс которые хранят уровень доступа.
|
1. Создать клаймс которые хранят уровень доступа.
|
||||||
2. Создать хендлерсы которые будут обрабатывать каждый уровень достпа.
|
2. Создать хендлерсы которые будут обрабатывать каждый уровень доступа.
|
||||||
3. Прописть роутинг согласно уроням доспуа к каждому урлу. (лучше поделить на группы и в каждой группе прописать миддлваре с соответствующим обработчиком хендлерсом.)
|
3. Прописть роутинг согласно уроням доспуа к каждому урлу. (лучше поделить на группы и в каждой группе прописать миддлваре с соответствующим обработчиком хендлерсом.)
|
||||||
|
|
||||||
|
23.08.2024.
|
||||||
|
создан миддле варе, package auth/ authAdminMiddlware нужно проверить роботостпособность. Протестировать.
|
||||||
|
|
||||||
*Добавление обьектов.
|
*Добавление обьектов.
|
||||||
@@ -50,7 +50,11 @@ func InitChiRouting() {
|
|||||||
r.Group(func(r chi.Router) {
|
r.Group(func(r chi.Router) {
|
||||||
r.Use(auth.AuthMiddleware)
|
r.Use(auth.AuthMiddleware)
|
||||||
r.Get("/profile", prf.Profile)
|
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
|
// up server on os.Getenv("SERVER_PORT") port on gorutin
|
||||||
|
|||||||
@@ -15,4 +15,5 @@ type Claims struct {
|
|||||||
jwt.RegisteredClaims
|
jwt.RegisteredClaims
|
||||||
Email string `json:"email"`
|
Email string `json:"email"`
|
||||||
Phone string `json:"phone"`
|
Phone string `json:"phone"`
|
||||||
|
Role string `json:"role"`
|
||||||
}
|
}
|
||||||
@@ -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)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -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))
|
||||||
|
})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user