Реализация роли с помощью Gin-JWT - PullRequest
1 голос
/ 22 марта 2019

Я работаю с фреймворком GIN и Gin-JWT в Голанге.Пока все хорошо, я смог авторизовать и аутентифицировать свой REST API с помощью JWT, следуя примеру в пакете Gin-JWT.

Сейчас я пытаюсь реализовать какую-то роль в своем API.Поток будет:

  1. Вход в систему и авторизация
  2. Создание JWT с внутренним идентификатором пользователя и RoleID
  3. Когда я вызываю 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.Или, если бы я мог знать в промежуточном программном обеспечении, какая функция (контроллер) будет вызываться позже, я мог бы тогда определить, авторизован ли он или нет.Но даже этот солютин звучит неловко для меня.Я думаю, что будет самое элегантное решение, есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...