这是对自己最近一个小项目中问题的记录,需求是只有登录的用户才能进入到该页面,所以需要在该页面进行判断用户是否登陆,开发用到了iris框架,这里用到中间件来实现这个功能。

  • 主要思路是:要实现该功能需要设置一下cookie,在登录页面提交的表单中将用户ID保存到cookie中,在受到权限的页面获取用户ID并判断是否为空,若为空则跳转到登录页面进行登录,否则则可以进入到该页面。
    登录相关代码如下:
func (c *UserController) PostLogin() mvc.Response{
	var (
		userName = c.Ctx.FormValue("userName")
		password = c.Ctx.FormValue("password")
	)
	//比对用户名和密码
	user, isOK := c.Service.IsPwdSuccess(userName,password)
	if !isOK{
		fmt.Println("用户名或者密码错误!")
		//如果没有成功就通过mvc.reponse跳转到login
		return mvc.Response{
			Path:"/user/login",
		}
	}
	//设置cookie
	tool.GlobalCookie(c.Ctx,"uid",strconv.FormatInt(user.ID,10))
	c.Session.Set("userID",strconv.FormatInt(user.ID,10))
	return mvc.Response{
		Path:"/product/detail",
	}
}

中间件(验证用户是否登陆)

func AuthConProduct(ctx iris.Context){
	//在user_controller中提交登陆表单的时候设置了cookie,所以在这里直接从上下文获取
	uid := ctx.GetCookie("uid")
	if uid ==""{
		ctx.Application().Logger().Debug("请先登陆!")
		ctx.Redirect("/user/login")
		return
	}
	ctx.Application().Logger().Debug("已登陆!")
	//继续请求上下文
	ctx.Next()
}

记得在main文件中将中间件注册到product中

    //注册路由
	proProduct :=app.Party("/product",middleware.AuthConProduct)
	proPro   := mvc.New(proProduct)//注册到框架上
	//将验证注册到product中
	proProduct.Use(middleware.AuthConProduct)
	//将service以及session绑定到控制器中
	proPro.Register(productService,orderService,sess.Start)
	proPro.Handle(new(controllers2.ProductController))