2016-03-26 12 views
2

私はnavbarと著作権情報を表示し、ログインを処理するマスターページを持っています。ユーザープロファイルを取得してコンテンツ関数に渡します。ユーザーがログインしていない場合はnilにします。ログインが必要なページについては、上部にチェックを入れます。ユーザーが署名されていない場合はリダイレクト名前空間宣言は、コンテンツ・機能についてはRing.util.response/redirectはリダイレクトされません

(ns kandj.views.content 
    (:require [ring.util.response :as response])) 

を含んで、私は次のコードを持っている:。

(defn profile [g-profile] 
    (if (nil? g-profile) 
    (do (response/redirect "/" 307) 
     (println "redirecting")) 
    )) 

それはコンソールにredirectingを出力しますが、それは実際にはしませんリダイレクト。私は様々なリダイレクトコード"307"の文字列を使用し、それを除外してデフォルトの302を使用しようとしました。何も試していないと、ページがリダイレクトされます。私は間違って何をしていますか?

答えて

4

response/redirectを最後の式にする必要があります。そうでない場合は、nilが返され、結果はprintlnとなります。

しかし、皆さんのページにセキュリティ関連のロジックを追加するのではなく、このようなクロスカッティングの問題を体系的に処理する必要があると思います。慣用的なアプローチは、リングのミドルウェアを使用することです。

リクエストされたURLにユーザーが認証されているかどうかを確認し、ページのレンダリングまたはログインページへのリダイレクトが必要かどうかを知る独自のミドルウェアハンドラを作成できます。例えば

friend

(defn authenticated? [request] 
    ... your logic to check if the user is authenticated or not...) 

(defn secured-url? [request] 
    ... your logic for determining if the requested page requires authenticated user...) 

(defn wrap-user-auth-check [handler] 
    (fn [request] 
    (if (and (secured-url? request) 
      (authenticated? request)) 
     (handler request) 
     (response/redirect "/")))) 

(def app 
    (-> handler 
    (wrap-user-auth-check))) 

また、リングのためのWebアプリケーションのセキュリティを扱うためのライブラリを見てかかることがあります。

+0

ああ。それをバブルアップさせて返す唯一の方法はありますか?私はテンプレートのためにしゃっくりを使用しています。 'println'を削除した後、他のコードの結果として'

{:status 302, :headers {"Location" "/"}, :body ""}
'を取得します。これは通常どのように行われますか? – kennycoc

+0

私はこの問題を解決しましたが、それを行う標準的な方法があれば理想的ではありません。私が知る限り、 'return'関数はありません。どのようにこの状況を処理するための最良の方法と思われる – kennycoc

+0

私はどのようにあなたのWebアプリケーションでそのようなケースを処理するために多くの情報で私の答えを強化している。 –

関連する問題