使用Yesod.Auth.Email的自定义注册表单

时间:2017-07-02 08:25:52

标签: haskell yesod

我有一个问题,为什么Yesod.Auth按原样完成。我试图创建一个自定义注册表单 - 即:除了电子邮件之外的更多字段 - 以下是我在此过程中遇到的问题:

  1. 我尝试创建在电子邮件模块中定义的自定义功能版本,以呈现自定义模板: defaultEmailLoginHandler defaultRegisterHandler defaultForgotPasswordHandler
  2. 它让我想知道:为什么我们不能简单地提供一个自定义的小村庄文件并完成它?为什么我必须创建这些功能的自定义版本?

    1. 模板部分完成后,我开始处理表格,在这里我撞墙了。我尝试创建 registerHelper 函数的自定义版本,但是,它不是Yesod.Auth.Email类的可见成员 因此,创建自定义 registerHelper 将无效。然后我想我可以通过重写 postRegisterR 来提供处理表单的自定义路由,然后我又运气不好。
    2. 为什么这些功能,特别是 registerHelper ,并未创建为Yesod.Auth.Email的可见成员?

      1. 我的第三次尝试是“分叉”整个Email.hs模块,但我再次没有达到使这成为可能的一些要求。在这种情况下,Yesod.PasswordStore不是一个公开的模块,因此我无法将其导入我的自定义Yesod.Auth.Email。
      2. 为什么 Yesod.PasswordStore 未公开?

        鉴于我不想深入挖掘兔子洞并重写密码存储,我才意识到使用Yesod.Auth.Email不可能有自定义注册表单。

        我在这里错过了什么,或者我说得对吗?为什么Yesod.Auth.Email是以这种方式构建的?

1 个答案:

答案 0 :(得分:1)

我并不完全了解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)]

以上是我个人项目中的代码。

  

为什么我们不能简单地提供自定义的hamlet文件并完成它?

那么你仍然可以提供自定义的hamlet文件。这就是我在setPasswordHandler

的实例中定义YesodAuthEmail的方式
  setPasswordHandler _ =
    selectRep $
    do provideRep $ return $(shamletFile "./templates/password.shamlet")
  

为什么Yesod.PasswordStore没有曝光?

如上所述,您仍然可以在不显示Yesod.PasswordStore的情况下更新密码。 relevant functions位于Yesod.Auth.Email模块中。

话虽这么说,我能理解你的担忧。这就是我为Yesod.Auth.Email模块中的所有端点实现JSON端点的原因,以便可以在客户端本身轻松完成验证和其他内容。这些端点已记录在上面链接的Haddock页面中。但是如果你想在注册页面中有自定义字段,我认为它可能涉及Yesod.Auth.Email模块中的一些代码更改。我建议你在github中打开一个问题(如果你也可以发送公关,那就是布朗尼点!)并在那里给我们反馈。我们非常愿意改变!