beego框架中在基类中根据自定义url实现简单的权限控制
个人学习体验的小项目添加个基类优化一下,根据url跟自定义url在加session实现登录控制
环境啥的我就不过多介绍,自行搜索我之前的文章
go语言环境windows跟linux相差不大
正文
1.创建基类base.go
D:\goblog\src\gblog\controllers
package controllers
import (
"fmt"
"strings"
"github.com/astaxie/beego"
)
type BaseController struct {
beego.Controller
}
//init只会在初次引用时执行一次,而Prepare会在每次调用中都执行一次
func (c *BaseController) Prepare() {
//根据url做个简单的权限判断控制
//获取url 拆分url
urlarr := strings.Split(c.Ctx.Request.RequestURI, "?")
url := urlarr[0]
//定义数组 存储需要登录的url
urls := [2]string{
"/test/aaa",
"/infolist",
}
//判断是否在数组
exists := in_Array(len(urls), func(i int) bool {
return urls[i] == url
})
//获取session
username := c.GetSession("username")
//进行跳转
if exists == true && username == nil {
c.Ctx.Redirect(302, "/login") //若Session中无用户ID则302重定向至登陆页面
}
//赋值
c.Data["username"] = username
fmt.Println(urls)
fmt.Println(url)
fmt.Println(exists)
}
func in_Array(n int, f func(int) bool) bool {
for i := 0; i < n; i++ {
if f(i) {
return true
}
}
return false
}
2.添加路由
beego.Router("/test", &controllers.TestController{}, "get:Test")
beego.Router("/test/aaa", &controllers.TestController{}, "get:Aaa")
3.在需要登录的控制器方法中把beego.Controller 改成 BaseController
看我测试控制器代码
package controllers
// TestController is a test control
type TestController struct {
//beego.Controller
BaseController
}
func (c *TestController) Test() {
c.Ctx.WriteString(`我是test控制器中的test方法`)
}
func (c *TestController) Aaa() {
c.Ctx.WriteString(`我是test控制器中的aaa方法`)
}
测试一下
未登录访问:http://127.0.0.1:8080/test/aaa
已登录访问:http://127.0.0.1:8080/test/aaa
完
相关文章