美文网首页
再谈认证和授权

再谈认证和授权

作者: 追风骚年 | 来源:发表于2020-07-14 18:35 被阅读0次

    https://github.com/appleboy/gin-jwt

    gin 有个 jwt 的库,类库其中的一个 middleware 是这样定义的

    
        // the jwt middleware
        authMiddleware, err := jwt.New(&jwt.GinJWTMiddleware{
            Realm:       "test zone",
            Key:         []byte("secret key"),
            Timeout:     time.Hour,
            MaxRefresh:  time.Hour,
            IdentityKey: identityKey,
            PayloadFunc: func(data interface{}) jwt.MapClaims {
                if v, ok := data.(*User); ok {
                    return jwt.MapClaims{
                        identityKey: v.UserName,
                    }
                }
                return jwt.MapClaims{}
            },
            IdentityHandler: func(c *gin.Context) interface{} {
                claims := jwt.ExtractClaims(c)
                return &User{
                    UserName: claims[identityKey].(string),
                }
            },
            Authenticator: func(c *gin.Context) (interface{}, error) {
                var loginVals login
                if err := c.ShouldBind(&loginVals); err != nil {
                    return "", jwt.ErrMissingLoginValues
                }
                userID := loginVals.Username
                password := loginVals.Password
    
                if (userID == "admin" && password == "admin") || (userID == "test" && password == "test") {
                    return &User{
                        UserName:  userID,
                        LastName:  "Bo-Yi",
                        FirstName: "Wu",
                    }, nil
                }
    
                return nil, jwt.ErrFailedAuthentication
            },
            Authorizator: func(data interface{}, c *gin.Context) bool {
                if v, ok := data.(*User); ok && v.UserName == "admin" {
                    return true
                }
    
                return false
            },
            Unauthorized: func(c *gin.Context, code int, message string) {
                c.JSON(code, gin.H{
                    "code":    code,
                    "message": message,
                })
            },
            // TokenLookup is a string in the form of "<source>:<name>" that is used
            // to extract token from the request.
            // Optional. Default value "header:Authorization".
            // Possible values:
            // - "header:<name>"
            // - "query:<name>"
            // - "cookie:<name>"
            // - "param:<name>"
            TokenLookup: "header: Authorization, query: token, cookie: jwt",
            // TokenLookup: "query:token",
            // TokenLookup: "cookie:token",
    
            // TokenHeadName is a string in the header. Default value is "Bearer"
            TokenHeadName: "Bearer",
    
            // TimeFunc provides the current time. You can override it to use another time value. This is useful for testing or if your server uses a different time zone than your tokens.
            TimeFunc: time.Now,
        })
    

    Authenticator 和 Authorizator 开始我没有弄明白,为什么需要两个函数,后来仔细推敲了一下作者想表达的正是认证和授权,用户登录到系统是一个认证的过程,不能通过认证则是 401,登录之后打开某个页面看见某个资源是一个授权的过程,不可以看见某个资源则是 403

    相关文章

      网友评论

          本文标题:再谈认证和授权

          本文链接:https://www.haomeiwen.com/subject/kaifhktx.html