Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何扩展Play2 scala Zentarks身份验证以自动获取用户_Scala_Playframework_Playframework 2.0 - Fatal编程技术网

如何扩展Play2 scala Zentarks身份验证以自动获取用户

如何扩展Play2 scala Zentarks身份验证以自动获取用户,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,在Play2的示例中,我们有一个方法 def isAuthenticated(f: => String => Request[AnyContent] => Result) = { Security.Authenticated(username, onUnauthorized) { user => Action(request => f(user)(request)) } } 我想做的是添加另一种方法,如果我想直接从数据库获取用户,可以使用这种方法

在Play2的示例中,我们有一个方法

def isAuthenticated(f: => String => Request[AnyContent] => Result) = {
  Security.Authenticated(username, onUnauthorized) { user =>
    Action(request => f(user)(request))
  }
}
我想做的是添加另一种方法,如果我想直接从数据库获取用户,可以使用这种方法

必须在所有方法中添加包装器会有点无聊

def method() = isAuthenticated { username => implicit request =>
  UserDAO.findOneByEmail(username).map { user =>
    Ok(html.user.view(user))
  }.getOrElse(Forbidden)
}
我是函数式编程新手,所有这些都让我头晕目眩:)


有什么建议吗?

半解决方案是将获取用户数据的步骤封装到某个函数中,并从模板级别(而不是每个操作)调用它,因为每个模板都只是一个scala函数

由于这种方法,如果您有多个操作使用同一视图(甚至布局),您不必每次都获取记录的用户,即:

用户视图中

@defining(Application.getLoggedUser){ user =>
    @yourlayout("Welcome") {
        <h2>Hello @user.name</h2>
        ...
    } 
}
@defining(Application.getLoggedUser){user=>
@yourlayout(“欢迎”){
你好@user.name
...
} 
}

半解决方案是将获取用户数据的步骤封装到某个函数中,并从模板级别(而不是在每个操作上)调用它,因为每个模板都只是一个scala函数

由于这种方法,如果您有多个操作使用同一视图(甚至布局),您不必每次都获取记录的用户,即:

用户视图中

@defining(Application.getLoggedUser){ user =>
    @yourlayout("Welcome") {
        <h2>Hello @user.name</h2>
        ...
    } 
}
@defining(Application.getLoggedUser){user=>
@yourlayout(“欢迎”){
你好@user.name
...
} 
}

您可以定义另一种方法,例如
IsAuthenticatedUser
,该方法将采用
User=>Request[AnyContent]=>Result类型的参数:

def IsAuthenticatedUser(f:User=>Request[AnyContent]=>Result)=IsAuthenticated{email=>Request=>
UserDAO.findOneByEmail(email.map{user=>
f(用户)(请求)
}.getOrElse(禁止)
}
然后,您可以按如下方式使用它:

def method=IsAuthenticatedUser{user=>request=>
Ok(html.user.view(用户))
}

您可以定义另一种方法,例如
IsAuthenticatedUser
,该方法将采用
User=>Request[AnyContent]=>Result类型的参数:

def IsAuthenticatedUser(f:User=>Request[AnyContent]=>Result)=IsAuthenticated{email=>Request=>
UserDAO.findOneByEmail(email.map{user=>
f(用户)(请求)
}.getOrElse(禁止)
}
然后,您可以按如下方式使用它:

def method=IsAuthenticatedUser{user=>request=>
Ok(html.user.view(用户))
}

这是最终的解决方案

trait Secured {

  def username(request: RequestHeader) = request.session.get(Security.username)

  def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }

  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }

}
用法:

object Application extends Controller with Secured {

  def index = withAuth { username => implicit request =>
    Ok(html.index(username))
  }

  def user() = withUser { user => implicit request =>
    val username = user.username
    Ok(html.user(user))
  }
}
如您所见,如果会话不存在,用户将被重定向到trait中指定的登录页面


如果在DAO中找不到用户名,情况也是如此。

这是最终的解决方案

trait Secured {

  def username(request: RequestHeader) = request.session.get(Security.username)

  def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }

  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }

}
用法:

object Application extends Controller with Secured {

  def index = withAuth { username => implicit request =>
    Ok(html.index(username))
  }

  def user() = withUser { user => implicit request =>
    val username = user.username
    Ok(html.user(user))
  }
}
如您所见,如果会话不存在,用户将被重定向到trait中指定的登录页面

如果在DAO中找不到用户名,情况也是如此