2015年1月3日土曜日

Yesod Authのカスタムログインフォーム

Yesod Authのカスタムログインフォーム


やっぱり次の要望としてログインフォームをイジりたくなってしまいます、英語で「Login」とか書かれても純粋日本男児としては体が受け付けません。
どうやったらカスタマイズ出きるかと調べたのでメモ。

Foundation.hsのYesodAuthインスタンスをイジる

authHashDBWithForm関数の宣言
import Yesod.Auth.HashDB (authHashDBWithForm, getAuthIdHashDB, HashDBUser(..))


authPluginsをauthHashDBからauthHashDBWithFormへ修正する
instance YesodAuth App where
    type AuthId App = UserId

    -- Where to send a user after successful login
    loginDest _ = HomeR
    -- Where to send a user after logout
    logoutDest _ = HomeR
    -- Override the above two destinations when a Referer: header is present
    redirectToReferer _ = True

    getAuthId creds = getAuthIdHashDB AuthR (Just . UniqueUser) creds
    authPlugins _ = [authHashDBWithForm loginForm (Just . UniqueUser)]
    ...
    ...

カスタムテンプレートを出力する関数を用意する
loginForm :: Route App -> Widget
loginForm action = $(whamletFile "templates/loginform.hamlet")

そして最後にhamletテンプレートファイルを作成
<div style="text-align:center">
    <h2>日本語でログインフォーム
    <form method="post" action="@{action}">
        <table border="0" cellpadding="0" cellspacing="0" style="margin-left: auto; margin-right: auto">
            <tbody>
                <tr>
                    <td valign="top">ログインID:
                    <td valign="top">
                        <input name="username" style="width:250px">
                <tr>
                    <td valign="top">パスワード:
                    <td valign="top">
                        <input type="password" name="password" style="width:250px">
                <tr>
                    <td colspan="2" valign="top">
                        <input type="submit" value="乱入じゃなくてログインする">

これで起動すると
となりした、オリジナルのログインフォームはjavascriptが動いていましたがこのフォームは動きません。authHashDB関数辺りを調べれば分かるような気がします。

参考にしたサイト


Authentication plugin for Yesod.

って書いてあるじゃないか、ちゃんとドキュメントを最初にしっかり読みましょう


0 件のコメント:

コメントを投稿