2014-03-13 51 views
1

我有一个LuminusWeb项目正在运行,我想配置Friend授权的路线。这样做的问题在于,朋友有同像这样的环服务器进行配置:如何在LuminusWeb项目中配置Friend?

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

;--- elsewhere --- 
(compojure/defroutes routes 
    (GET "/" req 

copied from github

但是,在LuminusWeb's handler,路线都分布在不同的地方,它有它的自己的意见和模型,所以处理程序几乎没有所有路线。但是,所有分散的路由都是使用配置声明的。这是LuminusWeb:

(def app (app-handler 
      ;; add your application routes here 
      [home-routes app-routes] 
      ... 

作为一个初学者,我的Clojure的理解是有限的,我不知道如何在这个地方配置Friend。我试着查看Friend的文档,但除了readmefriend-demo apps之外没有其他东西,所有的演示应用程序都使用相同的配置。

我已经设置了一个非常简单的basic project on github,它只有luminusweb和整合Friend的裸骨。

我在不同的(合理的)地方盲目地插入了Friend的配置,直到我摆脱了所有编译时错误,但该项目仍然因为某种原因没有运行(导致运行时错误) 。

所以,问题是,当我的路线分散在不同的命名空间,我没有处理程序/网站的方法,我应该在哪里配置朋友?

谢谢。

回答

3

前几天我面对同样的问题,我解决了这个问题。

在我handler.clj文件中,我定义我的路线是这样的:

(def secured-routes 
    [(friend/authenticate user-routes user/friend-settings) 
    (friend/authenticate epics-routes user/friend-settings) 
    home-routes app-routes]) 

正如你可以看到,他们中的一些被固定,有些则不是。然后,在应用功能我打电话给他们这样的:

(def app 
    (app-handler 
      ;; add your application routes here 
      secured-routes 
      ;; instead of [user-routes home-routes ...] 
...)) 

更新 是的,就是这样,这就是我的朋友设置什么样子:

(def friend-settings 
    {:credential-fn    (partial creds/bcrypt-credential-fn login-user) 
    :workflows     [(workflows/interactive-form)] 
    :login-uri     "/user/login" 
    :unauthorized-redirect-uri "/user/login" 
    :default-landing-uri  "/"}) 

其中登录用户是一个连接到datomic并读取用户/密码映射的函数。

你可以看看,代码:https://github.com/sveri/friend-ui/ 但是请注意,我是一个Clojure的初学者和自己的代码有一定远未习惯或者遵循最佳实践。

+0

非常好,谢谢,现在测试一下。 – Alexander

+0

嗨sveri,朋友的配置上方是'user/friend-settings'吗?像'{:credentials-fn(partial creds/bcrypt-credential-fn users)}'会做什么?感谢您的代码,我设法摆脱了用户身份 - 无运行时错误,但现在它不让我登录,即使使用正确的密码。它只是将我重新定向到登录页面,并添加了& login_failed = Y&username = user' ... – Alexander

+0

啊,实际上,我在配置中有一个错字。有趣的是,朋友没有抛出异常,我想它只是忽略未知的键..非常感谢你! – Alexander

1

如果你的例子中的app是一个戒指处理程序,那么你可以将它传递到friend/authenticate中间件,就像任何其他戒指处理函数一样。在friend/authenticate之后/之外,确保添加朋友需要的Ring中间件(包含compojure.handler/site,但您可以直接添加,如果您愿意的话)。

+0

谢谢。正试图创建一个自定义中间件,但它不太好,现在尝试@ sveri的答案。 – Alexander