goal-web/auth
goal 框架的用户认证组件,你可以在 http
、websocket
或者其他环境使用,有上下文即可。
go get github.com/goal-web/auth
goal 的脚手架自带了绝大多数开发一个 web 应用的所需要的功能和组件,当然这也包括了认证组件。一般情况下,我们只需要在 .env 修改自己的认证配置即可,比如 jwt
驱动的 secret 、session
驱动的 session_key 。
默认情况下,config/auth.go
配置文件像下面那样,默认添加了 jwt
、session
两个守卫配置
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
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 }
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")) }
type Guard interface { Once(user Authenticatable) User() Authenticatable GetId() string Check() bool Guest() bool Login(user Authenticatable) interface{} }
这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅
这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅
1 tousfun 2022-02-06 23:23:24 +08:00 via iPhone 给楼主点赞 |
![]() | 3 qbhy OP 截止到现在我发这条回复为止,goal 的队列组件、限流、序列化等组件都已经完成了,队列组件目前支持 卡夫卡和 nsq ,并且都支持延迟队列,后续还会继续完善和优化,欢迎大家关注。 |
4 xqcode 2022-03-08 14:37:16 +08:00 顶一个 |