V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
qbhy
V2EX  ›  Go 编程语言

🐶 goal 的用户认证(Auth)模块完成,离生产环境又双叒叕近了一步!

  •  1
     
  •   qbhy ·
    qbhy · 2022-02-03 23:58:51 +08:00 · 2119 次点击
    这是一个创建于 1024 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Goal-web/auth

    goal-web/auth
    goal 框架的用户认证组件,你可以在 httpwebsocket 或者其他环境使用,有上下文即可。

    安装 - install

    go get github.com/goal-web/auth
    

    使用 - usage

    goal 的脚手架自带了绝大多数开发一个 web 应用的所需要的功能和组件,当然这也包括了认证组件。一般情况下,我们只需要在 .env 修改自己的认证配置即可,比如 jwt 驱动的 secret 、session 驱动的 session_key 。

    配置 - config

    默认情况下,config/auth.go 配置文件像下面那样,默认添加了 jwtsession 两个守卫配置

    package config
    
    import (
    	"github.com/goal-web/auth"
    	"github.com/goal-web/contracts"
    	"github.com/goal-web/example/models"
    	"github.com/golang-jwt/jwt"
    )
    
    func init() {
    	configs["auth"] = func(env contracts.Env) interface{} {
    		return auth.Config{
    			Defaults: struct {
    				Guard string
    				User  string
    			}{
    				Guard: env.StringOption("auth.default", "jwt"), // 默认守卫
    				User:  env.StringOption("auth.user", "db"), // 默认用户提供者
    			},
    			Guards: map[string]contracts.Fields{
    				"jwt": { // 守卫名称
    					"driver":   "jwt", // 驱动,目前支持 jwt 、session
    					"secret":   env.GetString("auth.jwt.secret"), // jwt 签名所需的 secret ,不同的守卫建议不同的 secret
    					"method":   jwt.SigningMethodHS256, // jwt 签名方法
    					"lifetime": 60 * 60 * 24, // token 有效时长,单位:秒
    					"provider": "db", // 用户提供者名
    				},
    				"session": { // 守卫名称
    					"driver":      "session", // 驱动名
    					"provider":    "db", // 用户提供者名
    					// session 驱动所需的参数,如果应用需要配置多个 session 驱动的守卫,那么需要配置不一样的 session_key
    					"session_key": env.StringOption("auth.session.key", "auth_session"), 
    				},
    			},
    			Users: map[string]contracts.Fields{ // 用户提供者,目前只支持 db
    				"db": { // 用户提供者名称
    					"driver": "db", // 驱动名称
    					"model":  models.UserModel, // 用户模型
    				},
    			},
    		}
    	}
    }
    

    .env 的数据库相关配置

    # 默认连接
    auth.jwt.secret=jwt_secret
    auth.default=jwt
    

    定义模型 - define a model

    app/models/user.go 文件

    package models
    
    import (
    	"github.com/goal-web/database/table"
    	"github.com/goal-web/supports/class"
    )
    
    var (
    	UserModel = table.NewModel(class.Make(new(User)), "users")
    )
    
    func UserQuery() *table.Table {
    	return table.FromModel(UserModel)
    }
    
    type User struct {
    	Id       string `json:"id"`
    	NickName string `json:"name"`
    }
    
    // GetId 实现了 contracts.Authenticatable 接口,此方法必不可少
    func (u User) GetId() string {
    	return u.Id
    }
    

    用法 - method of use

    package controllers
    
    import (
    	"github.com/goal-web/contracts"
    	"github.com/goal-web/example/models"
    )
    
    func LoginExample(guard contracts.Guard) contracts.Fields {
    	//  这是伪代码
    	user := models.UserQuery().First().(models.User)
    
    	return contracts.Fields{
    		"token": guard.Login(user), // jwt 返回 token ,session 返回 true
    	}
    }
    
    func GetCurrentUser(guard contracts.Guard) interface{} {
    	return contracts.Fields{
    		"user": guard.User(), // 已登录返回用户模型,否则返回 nil
    	}
    }
    

    使用中间件

    package routes
    
    import (
    	"github.com/goal-web/auth"
    	"github.com/goal-web/contracts"
    	"github.com/goal-web/example/app/http/controllers"
    	"github.com/goal-web/session"
    )
    
    func ApiRoutes(router contracts.Router) {
        
        v1 := router.Group("", session.StartSession)
        
        // 直接应用在路由上
        v1.Get("/myself", controllers.GetCurrentUser, auth.Guard("jwt"))
        
        // 应用在路由组上
        authRouter := v1.Group("", auth.Guard("jwt"))
        authRouter.Get("/myself", controllers.GetCurrentUser, auth.Guard("jwt"))
    
    }
    

    守卫 API - guard api

    type Guard interface {
    	Once(user Authenticatable)
    	User() Authenticatable
    	GetId() string
    	Check() bool
    	Guest() bool
    	Login(user Authenticatable) interface{}
    }
    

    扩展守卫和用户提供者 - extension

    这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅

    在 goal 之外的框架使用 - use in frameworks other than goal

    这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅

    goal-web
    goal-web/auth
    [email protected]

    5 条回复    2022-03-08 14:57:27 +08:00
    tousfun
        1
    tousfun  
       2022-02-06 23:23:24 +08:00 via iPhone
    给楼主点赞
    qbhy
        2
    qbhy  
    OP
       2022-02-08 22:38:00 +08:00
    @919615766 谢谢。我给自己顶一个
    qbhy
        3
    qbhy  
    OP
       2022-02-08 22:39:51 +08:00
    截止到现在我发这条回复为止,goal 的队列组件、限流、序列化等组件都已经完成了,队列组件目前支持 卡夫卡和 nsq ,并且都支持延迟队列,后续还会继续完善和优化,欢迎大家关注。
    xqcode
        4
    xqcode  
       2022-03-08 14:37:16 +08:00
    顶一个
    qbhy
        5
    qbhy  
    OP
       2022-03-08 14:57:27 +08:00
    @xqcode 谢谢老哥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1657 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:51 · PVG 00:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.