6

玩!框架 2.0,使用安全特性

如果我让用户在未经身份验证的情况下浏览网站的几个部分,但在某些操作上他们需要进行身份验证,我如何在身份验证之前将他们重定向到他们的原始 url,而不是所有的 url?

Play! 的要求与此问题类似!1.x Playframework 的 Secure 模块在 login 后不会重定向到原始 url

但是,据我所知,原始 url 的 flash 参数在 2.0 中不可用。

基本上我正在寻找的更改将在身份验证方法处理程序中

def authenticate = Action { implicit request =>
    loginForm.bindFromRequest.fold(
      formWithErrors => BadRequest(html.login(formWithErrors)),
      user => Redirect(routes.Application.index).withSession(Security.username -> user._1)
    )
  }

某种Redirect(originalRequestUrl)会很方便。

对干净的解决方案有什么想法吗?

4

1 回答 1

11

您可以使用Referer标头,或在您的身份验证操作中显式携带返回 url

使用Referer标题

def authenticate = Action { implicit request =>
  loginForm.bindFromRequest.fold(
    errors => BadRequest(html.login(errors)),
    user => {
      val returnUrl = request.headers.get(REFERER).getOrElse(routes.Application.index.url)
      Redirect(returnUrl).withSession(Security.username -> user._1)
    }
}

显式携带返回 url

def authenticate(returnUrl: String) = Action { implicit request =>
  loginForm.bindFromRequest.fold(
    errors => BadRequest(html.login(errors, returnUrl)),
    user => Redirect(returnUrl).withSession(Security.username -> user._1)
  )
}

通过使用RefererHTTP 标头,您仍然必须处理浏览器不填充此标头的情况,并且通过显式携带返回 url 作为您的authenticate操作的参数,您可能会在代码处理中通过身份验证获得更多样板......</p >

于 2012-04-19T09:10:02.480 回答