我有一个关于为什么 Yesod.Auth 这样做的问题。我试图创建一个自定义注册表单 - 即:除了电子邮件之外还有更多字段 - 以下是我在此过程中遇到的问题:
- 我尝试创建电子邮件模块中定义的函数的自定义版本来呈现自定义模板:defaultEmailLoginHandler、defaultRegisterHandler、defaultForgotPasswordHandler。
这让我一直想知道:为什么我们不能简单地提供一个自定义的 hamlet 文件并使用它来完成?为什么我必须创建这些函数的自定义版本?
- 模板部分完成后,我开始处理表单,但在这里我遇到了困难。我尝试创建 registerHelper 函数的自定义版本,但是,这不是 Yesod.Auth.Email 类的可见成员 因此,创建自定义 registerHelper 不起作用。然后我想我可以通过重写 postRegisterR 来提供自定义路由来处理表单,但我再次不走运。
为什么这些函数,特别是registerHelper,没有被创建为 Yesod.Auth.Email 的可见成员?
- 我的第三次尝试是“ fork ”整个 Email.hs 模块,但我再次未能满足实现这一目标的一些要求。在本例中,Yesod.PasswordStore 不是公开模块,因此我无法将其导入到我的自定义 Yesod.Auth.Email 中。
为什么Yesod.PasswordStore没有被暴露?
鉴于我不想深入研究并重写密码存储,我只是意识到不可能使用 Yesod.Auth.Email 来创建自定义注册表单。
我在这里遗漏了什么还是我做对了?为什么 Yesod.Auth.Email 是以这种方式构建的?
最佳答案
我不太清楚 Michael Snoyman 对此的设计决策,但我的推理是“电子邮件”是注册帐户所需的最少信息。注册电子邮件后,注册链接电子邮件将发送到您的帐户,您可以通过该电子邮件验证您的帐户。在此密码重置页面上,我定义了所有自定义字段并设置新密码。我定义了自己的处理程序来设置新密码。代码通常是这样的:
if (jpNewPassword profile == jpConfirmPassword profile)
then do
newPass <- liftIO $ saltPass (jpNewPassword profile)
lift $
runDB $
do user <- getUser maid
update maid [UserPassword =. (Just newPass)]
以上是我个人项目之一的代码。
why we can't simply provide a custom hamlet file and be done with it?
那么您仍然可以提供自定义的 hamlet 文件。这就是我的 setPasswordHandler
在 YesodAuthEmail
实例中定义的方式:
setPasswordHandler _ =
selectRep $
do provideRep $ return $(shamletFile "./templates/password.shamlet")
Why Yesod.PasswordStore was not exposed?
如上所述,您仍然可以更新密码,而不会暴露 Yesod.PasswordStore
。 relevant functions位于 Yesod.Auth.Email
模块中。
话虽如此,我可以理解您的担忧。这就是为什么我为 Yesod.Auth.Email 模块中的所有端点实现了 JSON 端点,以便可以在客户端本身轻松完成验证和其他操作。这些端点已记录在上面链接的 Haddock 页面中。但如果你想在注册页面中有自定义字段,我认为可能涉及 Yesod.Auth.Email
模块中的一些代码更改。我建议你在 github 上提出一个问题(如果你也可以发送 PR,那就加分!)并在那里给我们反馈。我们非常愿意改变!
关于haskell - 使用 Yesod.Auth.Email 自定义注册表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868821/