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

基本的には、ユーザーにログインさせて、「ねえ、また私だ」と言う方法と、「ああ、ねえ、またあなただ、ここに行く」と言う方法をユーザーに与えたいと思っています。次に、ユーザーにWebページを提供します。これは、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 用です。

本当に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 に答える