2

(我使用 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 正确执行此操作?代码和一些解释真的很棒,我在这里很迷茫。

4

1 回答 1

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,那么浏览器会弹出一个对话框来询问用户凭据,所以你不需要登录页面。您需要以下方法来拦截所有请求并发送适当的标头:

(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"))))
于 2012-09-26T23:09:11.137 回答