Kahua6 ユーザ認証

ずいぶんたったけど、そろそろKahua復活したいので思い出すためにも復活
http://d.hatena.ne.jp/longicorn/20100405#p1


まず事前準備としてユーザを作成しておきます。

$ kahua-admin -S ../site
spvr> lsuser
()
spvr> adduser username hogehoge
done
spvr> lsuser
("username")


早速コードです。

;;ログイン入力フォーム
(define-entry (login)
              (define check
                (entry-lambda (:keyword loginname pass)
                              (if (kahua-login loginname pass)
                                (show-page "ログイン完了")
                                (show-page "ログインエラー")
                                )))

              (define (input-form)
                (kahua:xml-template->sxml
                  page-template
                  :title (title/ (@/ (id "title"))
                                 "appname")
                  :body (div/ (@/ (id "body"))
                              (form/cont/ (@@/ (cont check))
                                          (label/ (@/ (id "loginname-text") (for "loginname-text")) "ユーザ名")
                                          (input/ (@/ (id "loginname-input") (type "text") (size 20) (name "loginname")))
                                          (br/)
                                          (label/ (@/ (id "pass-text") (for "pass-text")) "パスワード")
                                          (input/ (@/ (id "pass-input") (type "password") (size 20) (name "pass")))
                                          (br/)
                                          (input/ (@/ (id "button") (type "submit") (name "submit") (value "ログイン")))
                                          )
                              )))
              (input-form)
              )


上記が出来たらkahua-spvrを立ち上げ、localhostのloginにアクセスします。
labe/のidとかは各自適当に設定してください。


check関数が今回の肝です。
ログインネームとパスワードをinput-formで取得し、check関数で実際にユーザが存在するかチェックしています。
check関数は継続エントリーなので外部からはアクセス出来ないので安全です。
kahua-loginが実際にログインを行う関数で、ログインできなかったらエラーなので、エラーと表示します。


実際にはkahua-loginの後の処理が不完全なので、成功したらトップページに移動、失敗したら再度入力画面に戻るなどの処理が必要です。


次はDB関係で、基礎が終了といった所かな。
その後は、実際に作っていて困ったこととかを書いていくつもりです。
例えば、今回でてきた自動に別のページに移動するリダイレクト処理とか。