Я работаю с фреймворком GIN и Gin-JWT в Голанге.Пока все хорошо, я смог авторизовать и аутентифицировать свой REST API с помощью JWT, следуя примеру в пакете Gin-JWT.
Сейчас я пытаюсь реализовать какую-то роль в своем API.Поток будет:
- Вход в систему и авторизация
- Создание JWT с внутренним идентификатором пользователя и RoleID
- Когда я вызываю REST API, я сталкиваюсь с ролью, связанной ск API с RoleID в JWT для авторизованного
Пока у меня есть это в моем основном:
jwtAfp := InitJwtMiddleware(db)
afb := r.Group("api/v1/afb")
afb.Use(jwtAfp.MiddlewareFunc())
afb.GET("/ping", afbController.Ping)
и это для InitJwtMiddleware с использованием Gin-JWT
func InitJwtMiddleware(db *gorm.DB) *jwt.GinJWTMiddleware {
return &jwt.GinJWTMiddleware{
Realm: "afb",
Key: []byte("secret pwd"),
Timeout: time.Hour,
MaxRefresh: time.Hour,
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(*model.User); ok {
return jwt.MapClaims{
"afb": v.ID,
}
}
return jwt.MapClaims{}
},
Authenticator: func(c *gin.Context) (interface{}, error) {
var loginVals login
if err := c.Bind(&loginVals); err != nil {
return "", jwt.ErrMissingLoginValues
}
email := loginVals.Username
password := loginVals.Password
var u model.User
db.Where("email = ?", email).First(&u)
if service.CheckPasswordHash(password, u.Password) {
return &u, nil
}
return nil, jwt.ErrFailedAuthentication
},
Authorizator: func(data interface{}, c *gin.Context) bool {
claims := jwt.ExtractClaims(c)
v, ok := data.(float64)
if ok && v == claims["afb"] {
return true
}
return false
},
Unauthorized: func(c *gin.Context, code int, message string) {
c.JSON(code, gin.H{
"code": code,
"message": message,
})
},
TokenHeadName: "Bearer",
TimeFunc: time.Now,
}
}
Я хотел бы добавить проверку роли в разделе «Авторизатор», но я пытаюсь понять, как я могу это сделать.Я придумываю передачу функции InitJwtMiddleware (db) и роли, это будет работать, но мне не нравится идея «навязывать» GinJWTMiddleware для каждого ROLE / API.Или, если бы я мог знать в промежуточном программном обеспечении, какая функция (контроллер) будет вызываться позже, я мог бы тогда определить, авторизован ли он или нет.Но даже этот солютин звучит неловко для меня.Я думаю, что будет самое элегантное решение, есть идеи?