(我使用Hunchentoot和Restas,只是想我也会在这里提到它)
我真的不知道如何通常使用HTTP来做这些事情,所以我认为发布我的代码可能是展示我意图的最简单方法:
(define-route log-in ("/log-in/" :method :post)
(multiple-value-bind (username pwd) (hunchentoot:authorization)
(cond ((and (nth-value 1 (gethash username *users*)) ;; User exists
(string= pwd (gethash username *users*)))) ;; Password is correct
;; Do something to keep track of logged in user
)))
我基本上只是想让用户登录,给他一些方式来说“嘿,这是我了”,并且我可以用某种方式说“哦,嘿!它是你再次,你去“然后为用户提供一个网页。 我认为这应该通过cookie完成,只需将一些值存储在一个可以根据cookie检查的列表中。
我应该如何使用Hunchentoot + Restas正确地做到这一点?代码和一些解释真的很棒,我在这里很丢失。
答案 0 :(得分:2)
您可能希望使用(start-session)
,然后添加如下方法:
(defmethod handle-request :before ((acceptor acceptor) (request request))
(unless (your-check-request-matches-login-page) ; skip session check on login page
(if (null *session*)
(redirect "/log-in")
(progn
(your-check-session-validity)
(other-stuff)))))
如果您需要使用登录页面进行身份验证,则上述方法将起作用。但是您需要另一种方式来从用户那里获取用户和密码,因为(authorization)
将为您提供浏览器在标头中发送的内容,以及用于basic-auth的内容。
如果您确实想使用basic-auth,那么浏览器会弹出一个对话框来询问用户凭据,因此您不需要登录页面。您需要以下方法来拦截所有请求并发送适当的标头:
(defmethod handle-request :before ((acceptor acceptor) (request request))
(multiple-value-bind (username pwd) (hunchentoot:authorization)
(if (and (nth-value 1 (gethash username *users*)) ;; User exists
(string= pwd (gethash username *users*))) ;; Password is correct
(progn
;; Do something here
)
(require-authorization "realm"))))