2012-08-26 6 views
6

Sono completamente bloccato su dove iniziare con ottenere un'area di accesso per un sito Clojure che sto costruendo (per divertimento).Tentativo di creare un accesso utente per Clojure/Korma/PostgreSQL sito

Ho guardato diverse risorse, che vi posterò qui di seguito, senza pietà di copia/incollato il codice, e la più vicina che può ottenere è una delle due situazioni:

La pagina di login prende il login ma dice che l'accesso non è riuscito, tuttavia, per quanto posso dire, il login corrisponde.

O ottengo questo errore: Nessun metodo in multimethod '-> sql' per il valore spedizione: null

Non sono sicuro di come interpretare l'errore precedente: è questa l'indicazione che ho bisogno di un multi -metodo o sta specificando che ho bisogno di controllare per nulla? Il requisito nulla non ha alcun senso. Non me lo chiedo davvero, ma se qualcuno vuole dare una spiegazione, è grandioso.

Ho testato l'output confrontando le query results-to-select dai dati grezzi non hash, ho esaminato 5 variazioni su questo tema, utilizzando tutto, dalle chiamate page-to-page alla creazione di nuovi defpartials, multi -metodi, defn, ecc

fonti che ho usato (purtroppo, non posso elencare tutti loro di essere un poster per la prima volta):

Questo si usa Clojure -> Korma -> PostgreSQL, ma il codice non sembra funzionare per più utenti?
http://www.vijaykiran.com/2012/01/17/web-application-development-with-clojure-part-2/

Questo mostra come utilizzare Noir e PostgreSQL (Sì, sto usando Noir): https://yogthos.net:11794/blog/23-Noir+tutorial+-+part+2

Il sito 4Clojure, ma che si usa CongoMongo:

Il Heroku Twitter clone, ma nessuna menzione su come creare login per una persona, molto meno diversi.

Ho anche acquistato programmazione Clojure da O'Reilly Press, ma ancora una volta, nulla su come creare un'area di accesso.

PRIMA MODIFICA: Mi è stato chiesto di creare un repository github di un sito autonomo. Ciò include un'area "Creazione account" funzionante che si trova nel file welcome.clj e solo una forma dell'area Login in login.clj.

Stavo tentando di ottenere alcuni degli stessi errori di lavoro che avevo avuto la scorsa notte e anche il tentativo di farlo funzionare prima di caricare i file. Non ho ancora nessun punto di partenza ragionevole, quindi non esiste ancora alcuna implementazione iniziale. Sono seriamente imbarazzato per le soluzioni che mi sono venute in mente, quindi non voglio postarle. Provo concettualmente cosa dovrei fare, ma per qualche ragione, non riesco a tradurre questo. Questo è il mio primo account github: il mio background è Python, Scheme a'la SICP e alcuni programmi di marketing Python + PostgreSQL che ho creato.

SECONDA MODIFICA: Ack! Non riesco a far funzionare la cosa affatto ... Sì, ho passato più di 20 minuti (ore) su questo, quindi devo solo ammettere che non ho ancora le conoscenze necessarie per realizzare questo, non importa quante fonti guardo. Ho eseguito il commit dei file aggiornati e di tutte le cose strane che ho provato, incluse tutte le variazioni sulla casella di accesso per l'esecuzione di SQL raw. La cosa più vicina che posso venire è prenderla in modo che non venga rilevato alcun errore, ma nessuna prova che qualcuno abbia effettuato l'accesso. Grazie mille per l'aiuto e i suggerimenti.Ritornerò sicuramente su questo più tardi.

https://github.com/dt1/noirKormaLogin

+0

Non sarebbe possibile, senza guardare il codice. Probabilmente puoi inserire il codice su github e dare un link qui. – Ankur

+0

Hai davvero bisogno di implementare il login da solo? Prendi in considerazione l'utilizzo dell'autenticazione JSSE nel contenitore (supponendo che tu stia eseguendo all'interno di un contenitore) o utilizzando SASL. Lascia che qualcos'altro gestisca la password che si destreggia per te e accetta le credenziali autenticate dal container. –

+3

Inoltre, se stai memorizzando le password, assicurati che siano degli hash correttamente salati. Non memorizzare mai password di testo in chiaro non crittografate e, se possibile, non memorizzare affatto password crittografate, solo hash salati che è possibile utilizzare per verificare che l'utente conosca la password corretta. –

risposta

3

ci sono un paio di questioni che vedo. Innanzitutto, in datapass.clj, stai creando un'entità senza contenuto. Non sono sicuro di come lo gestisca Korma. Sta cercando di inserire i risultati come input per altre funzioni, quindi ho potuto vedere come viene introdotto nil.

In secondo luogo, avrete bisogno di qualcosa per gestire il post di accesso. (defpage ...) gestisce solo le richieste GET per impostazione predefinita. Avrai bisogno di un numero defpage separato per gestire il post. Qualcosa in questo senso:

(defpage [:post "/login"] {:keys [user-name pwd]} 
    (if-let [user (db/find-user user)] 
    (if (noir.util.crypt/compare pwd (:password user)) 
     (do 
     (noir.session/put! :some-key some-value) 
     (noir.response/redirect "/success")) 
     noir.response/redirect "/failed-to-login")) 
    (noir.response/redirect "/failed-to-login")) 

session/put! è come mettere i dati nella sessione. L'impostazione predefinita è utilizzare un archivio in memoria. Avrai bisogno di aggiungere il middleware Ring per usare persistent sessions (guarda i Session Store).

Inoltre, se avrà fortuna, qualcuno ha appena pubblicato un app di autenticazione per Noir ... si consiglia di dare un'occhiata: https://github.com/xavi/noir-auth-app

Problemi correlati