gpt4 book ai didi

scala - 更改 Play IsAuthenticated 中的身份验证方法

转载 作者:行者123 更新时间:2023-12-02 03:41:34 25 4
gpt4 key购买 nike

我想为 Play2 Framework 应用创建自定义身份验证方法。我正在 Scala 和 Play 中尝试——而且我对这两者都是新手。

在 zentask 示例中,Trait Secured 中有一个名为 IsAuthenticated 的函数:

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

这个定义相当复杂。我在 stackoverflow 上发现了许多有关此定义语法的问题,但我仍然不确定如何更改它。

我可以通过数据库查找看到 User.authenticate 中发生的身份验证检查。但我想做的身份验证不使用数据库。我不确定如何或在哪里连接不同类型的身份验证。 Security.Authenticated() 是否使用 User 类/对象连接?

最佳答案

Security.Authenticated 仅检查 session 是否包含“用户名” key 。如果是,则用户应该经过身份验证。

您应该通过数据库查找或任何其他方式自行验证您的用户。然后,将用户 ID(或电子邮件,或只是姓名)存储在 session 中:

val user = // fetch user info
Redirect("/").withSession("userId" → user.id.toString)

然后将操作包装在 Security.Authenticated 调用中:

def someAction = Security.Authenticated(
req => req.session.get("userId"),
_ => Redirect(views.html.login())) { userId =>
Action {
Ok(html.index())
}
}

Authenticated 的第一个参数是一个从 session 中检索用户 ID 的函数。它返回一个Option[String],即Some[String](如果 session 中有id)或None(如果没有)。

req => req.session.get("userId")

第二个参数是一个函数,如果 session 不包含用户 ID,则返回要使用的 Result。您通常需要重定向到登录页面。

_ => Redirect(views.html.login())

最后一个参数是一个返回Action的函数。如果用户经过身份验证,则使用它。

userId => Action {
Ok(html.index())
}

您不必被迫使用 play 实现,可以随意将其包装在方便的助手中,或者从头开始编写以满足您的需求:

def myAuth(f: String => Result) = Security.Authenticated(
req => req.session.get("userId"),
_ => Redirect(views.html.login())) { userId =>
Action {
f(userId)
}
}

def someAction = myAuth { userId =>
Ok(html.index())
}

关于scala - 更改 Play IsAuthenticated 中的身份验证方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com