-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
I'm having a weird problem where I have a /signin/ page, which uses Post-Redirect-Get, where a user types credentials. It will POST them to /signin/check/. If the credentials are valid, it will save a parameter like c.Session["good"] = "good", and then immediately redirect to a protected page, /content/, via c.Redirect(routes.Content.Index()). I use an InterceptMethod like in the manual, to protect the page by checking the session vars.
Lately I have to sign-in twice before I can get to /content/. If I set the c.Session variables in the body of the /signin/check/ method, like this:
func (c Person) Check(p *models.Person) revel.Result {
...
if(p.WasValidLogin()) { // simplified
c.Session["Good"] = "good"
return c.Redirect(routes.Content.Index())
}
...
} and then immediately redirect to /content/, it doesn't yet know about the c.Session["Good"], so the InterceptMethod checkSignedIn() doesn't pass authentication, and redirects.
(relevant sections of app.go & init.go)
unc (c AuthController) checkSignedIn() revel.Result {
revel.INFO.Printf("%v", c.Session) // For some reason, always empty after first sign-in
if _, good := c.Session["Good"]; !good {
c.Flash.Error("Please log in first.")
return c.Redirect(routes.Person.Signin(c.Request.URL.Path))
}
return nil
}
...
type Content struct {
AuthController
}
func (c Content) Index() revel.Result {
return c.Render()
}
...
func init() {
...
revel.InterceptMethod(AuthController.checkSignedIn, revel.BEFORE)
...
}So I guess when the c.Redirect is called in Person.Check, the Cookie: header doesn't yet contain the REVEL_SESSION=etcetcGood=goodetcetc, although on the next request it is populated and succeeds.
Do you have any tips on how I should change my flow to accommodate the proper order of things?