【问题标题】:Datomic with friend authentication not working properly带有朋友身份验证的 Datomic 无法正常工作
【发布时间】:2014-06-02 06:46:52
【问题描述】:

我正在为我的大学开发一个 clojure Web 应用程序项目,我正在尝试将 datomic 数据库与朋友身份验证连接起来,但有点错误...我会进一步解释...

首先我正在像这样进行用户注册(用户插入到数据数据库中)并且它正在工作。

 (defn insert-user [firstname lastname email password sex date] (.get (.transact conn
                            [{
                           :db/id #db/id[:db.part/user -1000001]
                           :user/name firstname
                           :user/lastName lastname
                           :user/username email
                           :user/password (creds/hash-bcrypt password)
                           :user/gender sex
                           :user/birthDate date}
                         ]))

(resp/redirect "/")
)

路由处理程序和好友验证器看起来像这样...函数 main 是启动应用程序。

(def page (handler/site
        (friend/authenticate
          routes

          {:allow-anon? true
           :login-uri "/login"
           :default-landing-uri "/login"
           :unauthorized-handler #(-> (html5 [:h2 "You do not have sufficient privileges to access " (:uri %)])
                                    resp/response
                                    (resp/status 401))
           :credential-fn (partial creds/bcrypt-credential-fn users)
           :workflows [(workflows/interactive-form)]})

           (wrap-keyword-params routes)
           (wrap-nested-params routes)
           (wrap-params routes)

))

(defn -main []
(run-jetty page {:port 8080 :join? false}))

最后是用户的datomic查询匹配朋友的creds/bcrypt-credential-fn函数。

(defn upit-korisnici [] 
(def temp (d/q '[:find ?u ?p
         :where [?user :user/username ?u]
                [?user :user/password ?p]
         ]
        (d/db conn)))
(def users (into {} (map (fn [[k v]] [k {:username k :password v}]) temp)))
users
)

困扰我并让我无助的是,当我注册(插入用户)时,用户被插入到 datomic 数据库中,但是当我尝试登录时,我不能。它说错误的电子邮件和密码,但是新用户在那里。当我重新启动整个应用程序并尝试使用新用户凭据登录时,它会通过并登录。有人知道如何解决这个问题吗?

编辑:

我通过将 :credential-fn (partial creds/bcrypt-credential-fn users) 更改为 :credential-fn #(creds/bcrypt-credential-fn users % 解决了这个问题)

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您似乎认为它会自动更新您的用户数据,但事实并非如此,因为 user 不是一个函数,它是纯数据。发生的情况是 (def user... 运行然后结果绑定到名称用户,您没有绑定计算,因此数据永远不会更新。你对 temp 犯了类似的错误。查询运行一次,然后结果将绑定到 temp,并且永远不会重新评估。您应该将它们绑定到一个函数,以便它重新评估。

    【讨论】:

    • temp 和用户会更新,当我添加新用户时,它会随之更新,但在我重新启动应用程序之前它不会登录...我尝试像你说的那样将 temp 和 users 转换为函数但这是同样的错误。
    • 重新运行 def 以更改用户的值不会看到朋友看到的用户,即使用调用朋友/身份验证时看到的值传入。如果用户需要是可变的,您应该创建一个知道如何检查更新用户并将它们提供给朋友的函数(可能包装在 atom 或 db 调用上)。更改 var 绑定确实不是这样做的方法。
    • 我不太明白,你能给我举个例子吗?
    【解决方案2】:

    我开始为朋友库开发具有原子持久性的 UI:https://github.com/sveri/friend-ui/ 你可以看看它,也许它已经解决了你的问题,当然你可以从中获取代码,添加拉取请求/任何东西。当我有时间时,我会实施任何需要的。

    目前支持:

    • 注册
    • 登录
    • 退出
    • Twitter Bootstrap 支持模板

    如果我们能将完成的工作捆绑起来就好了,因为这将是很多人未来需要的东西。

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2014-11-17
      • 2012-10-20
      • 1970-01-01
      • 2020-05-18
      • 2015-02-16
      • 1970-01-01
      • 2018-02-13
      相关资源
      最近更新 更多