2016-03-26 30 views
2

Oturum açma işlemleri yanı sıra navbar ve telif hakkı bilgilerini görüntüleyen bir ana sayfam var. Kullanıcı profilini alır ve içerik işlevine iletir veya kullanıcı oturum açmamışsa sıfırdır. Bu nedenle, oturum açmak isteyip istemediğim sayfalarda, üstte bir kontrol yapacağım ve kullanıcı oturum değilse yönlendirme ad alanı bildirimi içerik fonksiyonu içinRing.util.response/yönlendirme siteyi yeniden yönlendirmiyor

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

içerir aşağıdaki kod var.

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

Bu konsola redirecting basar, ama aslında değil yönlendirir. Ben çeşitli yönlendirme kodu "307" için bir dize kullanmayı denedim ve 302 varsayılanını kullanmak için hariç. Denedim hiçbir şey sayfanın yönlendirmesine neden olur. Neyi yanlış yapıyorum?

cevap

4

response/redirect öğesinin son ifadesi olması gerekir, aksi halde işleyiciniz println ifadesinin sonucu olan nil değerini döndürür. Ancak, sayfalarınızın her birine güvenlikle ilgili mantık eklemek yerine, bu tür kesişen endişeleri sistematik olarak ele almanız gerektiğini düşünüyorum. Deyimsel yaklaşım halkanın middleware kullanmaktır.

İstenen URL'nin kullanıcının kimlik doğrulaması yapıp yapmadığını ve sayfanın oluşturulmasına veya giriş sayfasına yönlendirilmesine gerek olup olmadığını bilecek olan kendi orta katman işleyicinizi yazabilirsiniz. Örneğin

: Ayrıca yüzük için web uygulaması güvenliği yönetilmesi için bir kütüphanede bakmak olabilir

(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))) 

: friend.

+0

Oh. Onu havaya uçurmanın bir yolu var mı, ve geri gönderilen tek şey mi? Templama için hiccup kullanıyorum. 'Println' kaldırıldıktan sonra, diğer kodun bir sonucu olarak

{:status 302, :headers {"Location" "/"}, :body ""}
' aldım. Bu genellikle nasıl yapılır? – kennycoc

+0

Sorunu çözdüm, ancak standart bir yol varsa, idealden daha azdır. Anlayabildiğim kadarıyla, “dönüş” fonksiyonu yoktur. Bu durumun üstesinden gelmenin en iyi yolu hangisi olurdu? – kennycoc

+0

Web uygulamamda bu gibi durumlarla nasıl başa çıkacağımı öğrenmek için cevabımı geliştirdim. –