如何在LuminusWeb项目中配置好友?

时间:2014-03-13 10:48:32

标签: clojure authorization ring

我正在运行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。我试图查看朋友的文档,但除了readmefriend-demo apps之外没有任何其他内容,所有演示应用都使用相同的配置。

我已经设置了一个非常basic project on github,其中只有luminusweb和整合的朋友的骨头。

我盲目地将Friend的配置插入到不同(且明智的)的位置,直到我摆脱了所有的编译时错误,但项目仍然没有因为某种原因而运行(导致运行时错误) )。

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

谢谢。

2 个答案:

答案 0 :(得分:3)

前几天我遇到了同样的问题,我就这样解决了。

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

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

正如您所看到的,其中一些是安全的,一些则不是。然后,在app函数中我称之为:

(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       "/"})

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

您可以查看以下代码:https://github.com/sveri/friend-ui/ 但请注意,我自己就是一名初学者,而且那里的代码肯定远非惯用或遵循最佳实践。

答案 1 :(得分:1)

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