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条评论

发表评论