gin 框架,登录验证功能,然后每个接口都需要鉴权,用哪个包?

wn0112 · 2019-04-08 11:14:42 · 6082 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-04-08 11:14:42 的主题,其中的信息可能已经有所发展或是发生改变。

gin 框架,登录验证功能,然后每个接口都需要鉴权(session),用哪个包?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6082 次点击  
加入收藏 微博
9 回复  |  直到 2019-04-22 17:00:35
hequan2017
hequan2017 · #1 · 6年之前

casbin

wn0112
wn0112 · #2 · 6年之前

网上看到这个例子,cookie 的 value 要自己填吗?比如用SHA256加密 用户名密码得到的字串?

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    r := gin.Default()
    r.Use(AuthMiddleWare())
    {

        r.GET("/login", func(c *gin.Context) {
            cookie := &http.Cookie{
                Name:     "session_id",
                Value:    "onion",   //这个是value要自己生成??规则自定就可以?
                Path:     "/",
                HttpOnly: true,
            }
            http.SetCookie(c.Writer, cookie)
            c.String(http.StatusOK, "登录成功")
        })

        r.GET("/home", AuthMiddleWare(), func(c *gin.Context) {
            c.JSON(http.StatusOK, gin.H{"data": "hello world"})
        })
    }
    r.Run() // listen and serve on 0.0.0.0:8080
}

func AuthMiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println(c.Request.URL.String())
        if cookie, err := c.Request.Cookie("session_id"); err == nil {
            value := cookie.Value
            fmt.Println(value)
            if value == "onion" {
                c.Next()
                return
            }
        }
        if url := c.Request.URL.String(); url == "/login" {
            c.Next()
            return
        }
        c.JSON(http.StatusUnauthorized, gin.H{
            "error": "Unauthorized",
        })
        c.Abort()
        return
    }
}
pengzhenpin
pengzhenpin · #3 · 6年之前
wn0112wn0112 #2 回复

网上看到这个例子,cookie 的 value 要自己填吗?比如用SHA256加密 用户名密码得到的字串? ```go package main import ( "fmt" "github.com/gin-gonic/gin" "net/http" ) func main() { r := gin.Default() r.Use(AuthMiddleWare()) { r.GET("/login", func(c *gin.Context) { cookie := &http.Cookie{ Name: "session_id", Value: "onion", //这个是value要自己生成??规则自定就可以? Path: "/", HttpOnly: true, } http.SetCookie(c.Writer, cookie) c.String(http.StatusOK, "登录成功") }) r.GET("/home", AuthMiddleWare(), func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"data": "hello world"}) }) } r.Run() // listen and serve on 0.0.0.0:8080 } func AuthMiddleWare() gin.HandlerFunc { return func(c *gin.Context) { fmt.Println(c.Request.URL.String()) if cookie, err := c.Request.Cookie("session_id"); err == nil { value := cookie.Value fmt.Println(value) if value == "onion" { c.Next() return } } if url := c.Request.URL.String(); url == "/login" { c.Next() return } c.JSON(http.StatusUnauthorized, gin.H{ "error": "Unauthorized", }) c.Abort() return } } ```

Value 肯定要自己填写,你提到的用 SHA256 加密用户名密码也可以的,自己定义。 因为 http 是无状态的,你服务端需要保存这个字符串及其对应的用户,用户请求时带上这个 cookie,才能知道是请求用户是否登录、有没有权限等

wn0112
wn0112 · #4 · 6年之前
pengzhenpinpengzhenpin #3 回复

#2楼 @wn0112 Value 肯定要自己填写,你提到的用 SHA256 加密用户名密码也可以的,自己定义。 因为 http 是无状态的,你服务端需要保存这个字符串及其对应的用户,用户请求时带上这个 cookie,才能知道是请求用户是否登录、有没有权限等

没有现成的吗。。。比如python 的flask, 登录只要验证用户名密码就可以了,所有接口上加个装饰器 @login_required,就可以了。

那用 go 岂不是我要自己写一套鉴别方法和功能。。。如何生成value,如何比对value 验证身份

hequan2017
hequan2017 · #5 · 6年之前

自己写呀,写中间件

jarlyyn
jarlyyn · #6 · 6年之前

gin不熟,但是大概思路应该是共通的。

你应该是需要一个sesson组件和一个user组件,里面应该提供合适的中间件

你的代码太原始了,而且居然没有记录登录前的地址……

以我的代码为例

//middlewares.go
    MiddlewareMemberLoginOrRedirect = MemberLoginRedirector.Middleware(membermodule.Member)
    MiddlewareMemberLoginReqiured = user.LoginRequiredMiddleware(membermodule.Member, nil)

//userrouter.go var UserMiddlewares = func() middleware.Middlewares { return middleware.Middlewares{ middlewares.MiddlewareInstallMemberSession, middlewares.MiddlewareMemberLoginOrRedirect, } }

//routers.go
Router.StripPrefix("/usercenter/user").
    Use(UserMiddlewares()...).
    Handle(RouterUser)
jarlyyn
jarlyyn · #7 · 6年之前

如果你是用标准库的http为框架的话,session库可以考虑

https://github.com/gorilla/sessions

igufei
igufei · #8 · 6年之前

github.com/gin-contrib/sessions这个中间件可以帮助 到你

package main

import (
    "github.com/gin-contrib/sessions"
    "github.com/gin-contrib/sessions/cookie"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    store := cookie.NewStore([]byte("secret"))
    r.Use(sessions.Sessions("session_id", store))

    r.GET("/login", func(c *gin.Context) {
        session := sessions.Default(c)
        //登录成功后设置一下状态
        // AuthMiddleWare里可以判断是否登录成功,使用session.Get("status")
        session.Set("status", true)
        session.Save()
        c.JSON(200, gin.H{"status": true})
    })
    r.Run(":8000")
}
liulizhi
liulizhi · #9 · 6年之前

casbin

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传