import(
"github.com/gin-gonic/gin"
“log”
"strings"
"time"
"net/http"
"errors"
)
type stroe struct{}
func (s store) Get(key string) (string,error){
return cache.GetString(key)
}
func (s store) Set(key string, val []byte,expire int) error{
return cache.Set(key,val,expire)
}
Delete 和 Exist 与GET类同
type Option struct{
CookieName string
CookieHttpOnly bool
SecureCookie bool
HeaderName string
Salt []byte
Timeout int
Store Store
permission func(identity,path,method string) bool
TokenExtractOpts []extractTokenFunc
}
实现解压token函数
type ExtracTokenFunc func(c *gin.Context) (token string,err error)
func ExtraFromCookie(name string) ExtractTokenFunc{
if name == ""{
fmt.printf("名字不能为空")
}
return func (c *gin.Context) (token string,err error){
token ,err = c.Cookie(name)
return token,nil
}
}
设置初始化Opt函数
func New(opt *Option) *Option{
if opt.permission == nil
if opt.Store==nil
if len(opt.Salt)==0
if len(opt.TokenExtractOpts) == 0
if opt.HeaderName == ""
if opt.Timeout == 0
return opt
}
分别对Option结构体初始化
func (o *Option) extractToken (c *gin.Context) (token string,err error){
for _, f := range o.TokenExtractOpts{
if token ,err := f(c); err == nil{
return token,nil
}
}
}
func (o *Option) Middleware(c *gin.Context){
token, err := o.extractToken(c)
if err !=nil{
c.AbortWithStatusJSON(http.StatusBadRequest,gin.H{"error",err.Error()})
return
}
const tokenKey="abcdefg" //whatever you want
c.Set(tokenKey,token) //把token放到请求的上下文中
identity,err := o.Store.Get("token:"+token)
permit := o.permission(identity,c.Request.URL.Path,c.Request.Method)
c.Next()
}
初始化权限
var Auth = auth.New(&auth.Option{
CookieName: "abcdefg",
CookieHttpOnly: true,
HeaderName: "特朗普",
Salt: []byte("MAGA"),
Timeout: auth.timeout
Store store{}
permit: func(identity,path,method string)bool{
return enforcer.Enforce(identity,path,method)
},
TokenExtractOptions: []auth.ExtractTokenFunc{
auth.ExtractFromCookie("????我怎么知道要什么name")
auth.ExtractFromAuthHeader("来自大洋彼岸的头权限")
}
})
func Auth() gin.HandlerFunc{
if !Auth.Enable{
return func(context *gin.Context){}
}
return Auth.Middleware
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。