Clojure 具有朋友身份验证的Datomic无法正常工作
我正在为我的学院做一个clojure web应用程序项目,我正在尝试将datomic数据库与朋友身份验证连接起来,但有点问题…我将进一步解释 首先,我像这样做用户注册(在datomic数据库中插入用户),它正在工作Clojure 具有朋友身份验证的Datomic无法正常工作,clojure,Clojure,我正在为我的学院做一个clojure web应用程序项目,我正在尝试将datomic数据库与朋友身份验证连接起来,但有点问题…我将进一步解释 首先,我像这样做用户注册(在datomic数据库中插入用户),它正在工作 (defn insert-user [firstname lastname email password sex date] (.get (.transact conn [{
(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 "/")
)
路由处理程序和朋友身份验证器如下所示…主要功能是启动应用程序
(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查询,以匹配friend的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(部分creds/bcrypt credential fn users)更改为:credential fn#(creds/bcrypt credential fn users%)解决了这个问题。您似乎认为它会自动更新您的用户数据,但不会这样做,因为用户不是一个函数,而是普通数据。发生的是
(def user…
运行时,结果将绑定到用户名user,您没有绑定计算,因此数据永远不会更新。您对temp犯了类似的错误。查询一旦运行,结果将绑定到temp,并且永远不会重新计算。您应该将其绑定到函数,以便它重新计算值。我开始处理UI对于具有datomic持久性的friend lib:您可以看看它,也许它已经解决了您的问题,当然您可以从中获取代码,添加pull请求/任何东西。当我有时间时,我将实现任何需要的东西
目前它支持:
- 报名
- 登录
- 注销
- 对模板的Twitter引导支持
如果我们能将所做的工作捆绑在一起,那就太好了,因为这将是许多人将来需要的东西。temp和用户确实会更新,当我添加新用户时,它会随之更新,但在我重新启动应用程序之前它不会登录…我像你说的那样尝试将temp和用户转换为函数,但这是相同的错误。重新运行def to changee users的值没有看到friend看到的用户,这与调用friend/authenticate时看到的值一起传递。如果用户需要可变,您应该创建一个函数,知道如何检查更新的用户并将其提供给friend(可能通过atom或db调用包装).更改var绑定确实不是这样做的。我真的不明白,你能给我举个例子吗?