2016-03-26 1 views
2

J'ai une page maître qui affiche la barre de navigation et les informations de copyright, ainsi que la gestion des connexions. Il obtient le profil de l'utilisateur, et le passe à la fonction de contenu, ou nul si l'utilisateur n'est pas connecté. Donc, pour les pages que je voudrais ouvrir, je vais avoir un chèque en haut, et rediriger si l'utilisateur n'a pas signé dans la déclaration d'espace de noms comprendRing.util.response/redirection ne redirige pas le site

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

pour la fonction de contenu, je le code suivant:.

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

il imprime redirecting à la console, mais il ne fait pas réorienter. J'ai essayé diversement d'utiliser une chaîne pour le code de redirection "307", et en l'excluant pour utiliser la valeur par défaut de 302. Rien que j'ai essayé ne provoque la redirection de la page. Qu'est-ce que je fais mal?

Répondre

4

Vous devez avoir votre response/redirect comme dernière expression sinon votre gestionnaire renvoie nil qui est le résultat de l'expression println. Cependant, je pense que vous devriez traiter systématiquement de telles préoccupations transversales au lieu d'ajouter une logique liée à la sécurité à chacune de vos pages. L'approche idiomatique consiste à utiliser le middleware de Ring.

Vous pouvez écrire votre propre gestionnaire de middleware qui saura si l'URL demandée nécessite que l'utilisateur soit authentifié ou non et passer à la page de rendu ou rediriger vers la page de connexion.

Par exemple:

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

Vous pouvez aussi jeter un oeil à une bibliothèque de gestion de la sécurité de l'application Web pour l'anneau: friend.

+0

Oh. Y a-t-il un moyen de le faire exploser et d'être la seule chose qui reviendra? J'utilise hoquet pour le gabarit. Après avoir enlevé le 'println', j'obtiens'

{:status 302, :headers {"Location" "/"}, :body ""}
'à la suite de l'autre code. Comment cela se fait-il habituellement? – kennycoc

+0

J'ai résolu le problème, mais il est loin d'être idéal s'il existe un moyen standard de le faire. Pour autant que je sache, il n'y a pas de fonction 'return'. Ce qui semble être la meilleure façon de gérer cette situation – kennycoc

+0

J'ai amélioré ma réponse avec plus d'informations sur la gestion de tels cas dans votre application web. –