首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go语言之-Middleware权限认证

Go语言之-Middleware权限认证

原创
作者头像
Wilbur-L
修改2021-03-11 17:56:53
修改2021-03-11 17:56:53
8230
举报
文章被收录于专栏:iOS底层原理iOS底层原理

一·Package

import(

"github.com/gin-gonic/gin"

“log”

"strings"

"time"

"net/http"

"errors"

)

二·实现以下几个Api

GET

type stroe struct{}

func (s store) Get(key string) (string,error){

return cache.GetString(key)

}

SET

func (s store) Set(key string, val []byte,expire int) error{

return cache.Set(key,val,expire)

}

Delete 和 Exist 与GET类同

创建一个Auth.Option结构体

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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·Package
  • 二·实现以下几个Api
    • GET
    • SET
  • 创建一个Auth.Option结构体
  • 权限控制中间件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档