Go
beego利用Prepare进行访问权限控制
beego利用Prepare进行访问权限控制,防止同账号多地登陆
最近自己用beego捣鼓了一个网站,然后后台需要判断是否同个账号多地登陆,类似异地登陆,自己在官方文档是没有看到这一块的相关介绍,只给出了一个URL过滤器功能,博主按照文档的说明进行过滤是成功的,但是每次加URL都需要进行加,比较麻烦,后面在控制器文档上看到了Prepare函数方法,感觉这个可以利用,后面自己尝试试了下,还真是成功,自己将这个过程分享出来给大家参考。
我们先定义一个基础控制器,后面其他每一个控制器每次请求都必须先走这个基础控制器,然后在基础控制器定义Prepare函数方法,这样每次请求函数方法前都必须先执行这一个函数方法,这样就达到我们的目的,代码如下:
/**后台基础配置**/ type AdminBaseController struct { beego.Controller } /**函数初始化**/ func (self *AdminBaseController) Prepare() { //获取当前路由 getRoute := self.Ctx.Request.RequestURI //获取是否路由白名单 routeStatus := getRouteStatus(getRoute) //判断路由处理 if routeStatus != true { ok := IsLogin(self.Ctx) if !ok { self.Ctx.Redirect(302, "/adminLogin") } } }
在Prepare函数中每次执行的时候,会先获取当前请求路由,然后将请求路由传达给我们自己定义的函数getRouteStatus函数来判断是否要走检验流程,如果需要,则进行判断是否合法,不合法会走302跳转,代码如下:
/** 获取路由白名单 */ func getRouteStatus(route string) bool { //设置路由白名单 var whiteRoute = [3]string{"/adminLogin", "/adminDoLogin", "/adminLoginOut"} //判断路由处理 for _, v := range whiteRoute { if v == route { return true } } //收尾 return false }
通过我们自己设置的白名单路由,部分路由是可以不用走验证,主要是登陆方面的请求不需要走验证。
然后我们需要借助cookie来辅助实现防止同账户同时登陆,代码如下:
/** 获取用户登陆状态【处理用户身份机制】 */ func IsLogin(ctx *context.Context) (bool) { //获取用户tokenId、token tokenId := ctx.GetCookie("tokenId") token := ctx.GetCookie("token") //判断用户是否存在令牌 if tokenId == "" { return false } if token == "" { return false } //获取用户信息 adminId, _ := strconv.Atoi(tokenId) admin := models.GetAdminUser(adminId) if admin.Id admin.TokenOverAt { return false } //用户在线状态合法并返回正确标识 return true }
以上函数会读取当前cookie,如果不存在返回false,当前存储cookie与数据库不同也会返回false,通过这样处理就可以防止同一账户,同时多地登陆。
以下是其他控制器引用基础控制器代码
/** 后台-文章模块 */ type AdminArticleController struct { AdminBaseController }
这样就可以通过Prepare函数来实现权限控制,而不需要通过url过滤这种方式来实现。
0条评论