1

我正在使用 Luminus 开发一个站点,直到现在我的中间件 wrap-base 函数看起来像:

(defn wrap-base [handler]
  (-> ((:middleware defaults) handler)
  wrap-auth
  (wrap-access-rules {:rules rules :on-error on-error})
  (wrap-authentication (session-backend))
   wrap-flash
  (wrap-defaults
    (-> site-defaults
        (assoc-in [:security :anti-forgery] false)
        (assoc-in  [:session :store] (ttl-memory-store (* 60 30)))))
  wrap-internal-error))

和我的 routes/home.clj 文件:

 (defn home-routes []
   [""
     {:middleware [middleware/wrap-csrf
                   middleware/wrap-formats]}
     (merge public-routes admin-routes)])

但现在我需要开发一个新的 API(“/api/getcustomers”),所以所有的身份验证/授权(和 csrf)中间件必须只用于“home-routes”,而不是用于新的 API 路由。API 路由保存在新的 routes/services.clj 文件中。

令人高兴的是 Luminus 使用 reitit.ring,一种数据驱动的路由解决方案,但我不确定如何将身份验证/授权内容从通用中间件中移出并仅将其分配给“home-routes”部分。

4

1 回答 1

1

我结束了为 ring 中的新 API 创建规则:

  ;; File: src/some_app/middleware.clj  
  (defn open-gates [request]
       true)

  (def rules [{:pattern #"^/admin.*"
         :handler admin-access
         :redirect "/notauthorized"},
        {:pattern #"^\/vclass.*"
         :handler user-access
         :redirect "/notauthorized"},
        {:pattern #"^\/api.*"
         :handler open-gates
         :redirect "/notauthorized"},
        {:pattern #"^/user.*"
         :handler authenticated?}])
于 2020-01-18T21:50:14.423 回答