使用RESTAS和Hunchentoot进行用户身份验证

时间:2012-09-26 22:17:14

标签: common-lisp hunchentoot

(我使用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正确地做到这一点?代码和一些解释真的很棒,我在这里很丢失。

1 个答案:

答案 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"))))