前言
大家好,我是作曲家种太阳
上一篇我们讲了jwt验证并完善了登录接口的逻辑
这一篇我们讲下常用中间件的开发
这次我们开发的中间件有:
1.跨域中间件 3.权限认证中间件(简单实现)
1. 介绍
跨域中间件 : 后端开启跨域功能
权限认证中间件: 判断用户的角色以及是否有权限
2. 跨域介绍
跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
浏览器在什么情况下会发起options预检请求?
在非简单请求且跨域的情况下,浏览器会发起options预检请求。
Preflighted Requests是CORS中一种透明服务器验证机制。预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。
3. 跨域中间开发
在 middlewares/cors.go中编写
package middlewares
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token, x-token")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PATCH, PUT")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
}
}
复制代码
ps: 1. 主要是返回的Response添加了约定的请求头
2. 请求方式如果是OPTIONS直接返回204
4.使用跨域中间件
在 initialize/router的Router函数加入
// 设置跨域中间件
Router.Use(middlewares.Cors())
复制代码
4.iIsAdminAuth中间件开发
在 middlewares/admin.go中添加
package middlewares
import (
"github.com/gin-gonic/gin"
"net/http"
)
// IsAdminAuth 判断权限
func IsAdminAuth() gin.HandlerFunc {
return func(ctx *gin.Context) {
// 获取token信息
claims, _ := ctx.Get("claims")
// 获取现在用户信息
currentUser := claims.(*CustomClaims)
// 判断role权限
if currentUser.AuthorityId != 1 {
ctx.JSON(http.StatusForbidden, gin.H{
"msg": "用户没有权限",
})
//中断下面中间件
ctx.Abort()
return
}
//继续执行下面中间件
ctx.Next()
}
}
复制代码
ps; 原理判断token的AuthorityId
5.使用IsAdminAuth中间件
在 router/user.go中添加
UserRouter.GET("/list", middlewares.JWTAuth(), middlewares.IsAdminAuth(), api.GetUserList)
复制代码
ps:一定一定要注意,jwt中间件在IsAdminAuth的前面!!
最后-验证结果环节
测试isadmin中间件
测试一个role为2的用户, 一定及得携带x-token字段的header!
如果这系列的文章对你有有用,请点赞和留言吧~
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END