使用Revel

时间:2016-08-07 10:45:20

标签: authentication revel

我有一个用revel框架制作的golang web应用程序。我在登录后面临重定向到上一页的问题。我有几页用户应该登录以查看内容。如果用户未登录,我已成功重定向到登录页面。以下是我的代码片段:

 
func checkUser(c *revel.Controller) revel.Result {
if _, ok := c.Session["user"]; ok {
    return nil
}
  var cont = c.Request.RequestURI
  fmt.Printf("Requesting URL : ", cont)
  return c.Redirect(LoginApp.Login, cont)
}

func init() {
  revel.InterceptFunc(checkUser, revel.BEFORE, &App{})
}

这是我的app.go

type App struct {
  *revel.Controller
}

func (c App) Application() revel.Result {
  var app = make(map[string]string)
  app["appTitle"] = "Hourglass"
  app["ngApp"] = "app"
  app["theme"] = "dark"
  app["ngController"] = "ApplicationController"
  return c.Render(app)
}

func (c App) Test() revel.Result {
  var app = make(map[string]string)
  app["appTitle"] = "Hourglass"
  app["ngApp"] = "app"
  app["theme"] = "dark"
  app["ngController"] = "ApplicationController"
  return c.Render(app)
}

现在我有一个login.go文件,其中包含 ServiceLogin 方法

func (c LoginApp) ServiceLogin(user models.User) revel.Result {

  username := user.UserName
  password := user.Password
  fmt.Printf("", username)
  fmt.Printf("", password)
  sess := service.GetSession()
  usercoll := sess.DB("hourglass_dev").C("user")
  var result models.User
  var err = usercoll.Find(bson.M{"UserName": username, "Password":   password}).One(&result)
  fmt.Printf("", result)
  fmt.Printf("", c.Request.RequestURI)
  if err != nil {
    fmt.Printf("", err)
  }
  //var app := make(map[string]string)
  //return c.Render(app)
  c.Session["user"] = username
  return c.Redirect(App.Application)
}

现在在方法的最后一行,我必须硬编码 App.Application ,而不是我想要使用请求的URL,以便当用户成功登录时,它会自动重定向到他们要求的页面。

1 个答案:

答案 0 :(得分:1)

您可以做一些事情:

  • 您可以在请求中使用标头的referer field并重定向回那里。我不知道referer字段有多可靠,所以我不认为我会自己使用这种技术,但它很容易,所以根据你的用例,它可能已经足够好了。在狂欢中,您将使用以下内容访问引用者:

    c.Request.Header["referer"].Get()
    
  • 您可以将要重定向到的原始链接存储在数据库中,并将该链接与您正在使用的会话ID相关联。 Revel没有附带数据库,但它带有可能有效的内存缓存。

  • 您可以将链接存储在客户端的cookie中。我从来没有这样做,所以我不确定你需要考虑什么,但我相信它会起作用。

  • 您可以通过请求参数将链接传递给流程中的每个URL。这项技术需要记住一些事项,包括安全性,url转义等等,但这种技术有一些优点,例如不需要数据库访问。您的网址如下所示:

    http://www.example.com/loginurl?redirecturl=[someurl]