Subsections

CookieAuthenticate - クッキーを使った認証

モジュール

クッキーを使った認証は、ウェブサイトのユーザーに対し、ユーザー名とパスワードを使ってログイン/ログアウトを可能にします。

彼らがログイン中は、そのセッション情報はクッキーを使って彼らのコンピュータの中に入っています。

もし彼らが長い間アクセスしていない場合、自動的にログアウトされます。

このモジュールはクッキーを使った認証の実装を簡単にします。

これは多くのクッキー認証のやり方とは違い、セッション情報を入れるために、サーバサイドにデータベースを必要としません。セッション情報を入れるのには3つのクッキーを使います。

このモジュールを使うには、CookieAuthenticateを継承したCherryClassを宣言することであり、そうすればそのCherryClassのmaskとviewは自動的に保護されます。

この魔法を実行するために、CookieAuthenticateはAOP(アスペクト指向プログラミング)を使います。これは基本的に、各maskとviewの先頭に追加するコードをつけくわえる、ということを意味します。

以下の変数とメソッドを使う事ができます:

variable: loginCookeName
ログイン名が入っているクッキーの名前の文字列変数です(デフォルト値はCherryLogin)。

variable: dateCookieName
最後にアクセスした時間が入っているクッキーの名前の文字列変数です(デフォルト値はCherryDate)。

variable: passwordCookieName
パスワードが入ったクッキーの名前の文字列変数です(デフォルト値はCherryPassword)。

variable: timeout
タイムアウトを分単位で入っている整数です。もしユーザーがこの時間アクティブではないと、自動的にログアウトされます。デフォルト値は60分です。タイムアウトさせたくない場合、0をセットしてください。

function: getPasswordListForLogin(login)
これは有効なログイン/パスワードの組み合わせを指定した場所です。引数はユーザーが入ったloginです。このメソッドはこのログイン名に対して有効な全てのパスワードのリストを返します。もしログイン名が間違っている場合、空のリストを返します。

注意:一つのログイン名にマッチする複数のパスワードを返すことができるということは、どのログイン名でも有効に働く「マスターキー」のパスワードを持ったままにするということです。

mask or view: loginScreen(message, fromPage, login='')
これはユーザーがログインしないで保護されたページにアクセスしようとした時に表示するページです。

messageは、誰もログインしていない理由が入った文字列です。 可能な値は:

fromPageはユーザーがアクセスしようとしたページのURLがはいった文字列です。

loginはもしログインしたユーザーがいたらそのユーザー名が入っている文字列です。もしこの文字列が空ではない場合、ユーザーがログインして入って来ていたということです。しかしパスワードが間違っていた場合、これはユーザーがそこにログイン名を使っているクッキーを持っているということです。これはフォーム上にログイン名の表示を許すことであり、よってユーザーは毎回ログイン名を入れる必要がなくなるというわけです。

CherryClassはデフォルトのloginScreen maskから成り立ちます。あなたはたぶん必要に応じてカスタマイズするため、これを上書きしたいとおもっているでしょう。それを行うには、3つのパラメータ(login, password, そしてfromPage)を持ったdoLoginメソッドを呼び出すフォームを定義することです。3つのパラメータの内、最初の2つはユーザーによって入力されます。3つ目は関数へ渡す値を持っているhiddenフィールドです。

以下のコードはloginScreenmaskのデフォルトの実装です:

<html><body>
    Message: <div py-eval="message">message</div>
    <form method="post" action="doLogin">
        Login: <input type=text name=login py-attr="login" value="" length=10><b
r>
        Password: <input type=password name=password length=10><br>
        <input type=hidden name=fromPage py-attr="fromPage" value=""><br>
        <input type=submit>
    </form>
</body></html>

mask 又は view: logoutScreen()
このページはユーザーがログアウトした後に表示されます。このメソッドはdoLogoutメソッドによって呼び出されます。 必要に応じて上書きすることができます。

view doLogout()
これはログアウトを実行するために呼び出すmaskまたはviewです。このメソッドはログアウトを実行し、それからログアウトスクリーンを表示するためにlogoutScreenメソッドを呼び出します。

variable: login
ログインするユーザーのログイン名が入っている文字列です。 この文字列は誰もログインしていない場合は空になっています。

サンプル例

以下のコードはCookieAuthenticateモジュールを使った例です:

use CookieAuthenticate

CherryClass MemberArea(CookieAuthenticate):
mask:
    def index(self):
        <html><body>
        Welcome to the member area, <py-eval="self.login"><br>
        If you want to log out, just click <a py-attr="self.getPath()+'/doLogout
'" href="">here</a>.<br>
        Otherwise, just click <a py-attr="request.base" href="">here</a> to go b
ack to the home page.
        </body></html>
    def loginScreen(self, message, fromPage, login=''):
        <html><body>
            Welcome to the login page. Please enter your login and password belo
w:
            <py-if="message==self.wrongLoginPasswordMessage">
                <br><font color=red>Sorry, the login or password was incorrect</
font>
            </py-if>
            <form method="post" action="doLogin">
                Login: <input type=text name=login py-attr="login" value="" leng
th=10><br>
                Password: <input type=password name=password length=10><br>
                <input type=hidden name=fromPage py-attr="fromPage" value=""><br
>
                <input type=submit value="Login">
            </form>
        </body></html>
    def logoutScreen(self):
        <html><body>
            You have been logged out.<br>
            Click <a py-attr="request.base" href="">here</a> to go back to the h
ome page.
        </body></html>
function:
    def getPasswordListForLogin(self, login):
        if login=="login": return ["password"]
        return []


CherryClass Root:
mask:
    def index(self):
        <html><body>
            Hi, welcome to my site<br>
            <py-if="self.login">
                You are currently logged in as <py-eval="self.login"><br>
                Click <a py-attr="memberArea.getPath()+'/doLogout'" href="">here
</a> to log out
            </py-if><py-else>
                You are not currently logged in.<br>
                Click <a py-attr="memberArea.getPath()+'/index'" href="">here</a
> to login
            </py-else>
        </body></html>


Debian User 2003-10-13