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