かぴぶろぐ

またかぴったかと思った・・・(´A`;)

Zope SESSIONで認証

カテゴリ[ Zope ]
SESSIONの追加
<dtml-call expr="REQUEST['SESSION'].set('login_user','kapi')">
SESSIONの取得
<dtml-var "REQUEST['SESSION'].get('login_user')">
SESSION-key有ればこっち、なければあっちを作ってみる。
<dtml-if expr="REQUEST.has_key('login_user'')">
  <dtml-call expr="REQUEST['SESSION'].set('login_user',username)">
<dtml-elif expr="not REQUEST['SESSION'].has_key('login_user')">
  <dtml-call expr="REQUEST['SESSION'].set('login_user','ゲストさん')">
</dtml-if>
これ踏まえて、RDBでフォーム認証を作ってみる。
DTML
  • index_html 認証前ページ(Zopeの獲得も考慮)
  • login_form_html 認証フォームページ。認証前ユーザーが飛ばされるページ
  • main_html 認証後のトップ
  • logout_html 「ログアウトしました」ページ
Python
  • main.py(Product用のclassを想定してます)
Python(Product用)
main.py

class Admin:

    def __init__(self):
       ...省略...

    def index_html(self, REQUEST=None):
        """ index_html """

        """ login_userキーがあり、且つNoneじゃない場合のみ
        main_htmlへ通過 """

        self.message = ""

        if REQUEST.SESSION.has_key('login_user'):
            if REQUEST.SESSION.get('login_user') != None:
                print "REQUEST.SESSION.get('login_user')"
                print REQUEST.SESSION.get('login_user')
                return self.main_html(self, REQUEST)

        return self.login_form_html(self)

    def login(self, REQUEST=None):
        """ login """
        self.message = ""
        result = self['sql'].authenticate(REQUEST).dictionaries()
        self.REQUEST.set('result',result)
        if result:
            REQUEST.SESSION.set('login_user',result[0])

            return self.main_html(self, REQUEST)

        else:
            self.message="ログイン情報が間違っています"
            return self.login_form_html(self, REQUEST)

    def logout(self, REQUEST=None):
        """ logout """
        self.message = ''

        if REQUEST.SESSION.has_key('zcma_user'):

            REQUEST.SESSION.set('login_user',None)

            self.message="ログアウトしました。"

            return self.logout_html(self)
ZSQLMethodUserテーブルの例として、SimpleUserFolderProductのZSQLを参考にしてます。
authenticate
/**
Name: authenticate.zsql
arguments: name password

*/

SELECT
    *
FROM
    users
where
    name = <dtml-sqlvar name type="string">
and
    password = <dtml-sqlvar password type="string">

limit 1
createTables.zsql
/**
Name: createTables.zsql
arguments:
*/
create table users (name varchar, password varchar, extra1 varchar, extra2 integer)
<dtml-var sql_delimiter>
create unique index name on users (name)
<dtml-var sql_delimiter>
create table roles (name varchar, role varchar)
予めDB、テーブルは設定しとく事。

DTML
login_form_html
<dtml-var standard_html_header >

        <form  method="post" action="login">

        <dtml-if message>
        <div class="message"><dtml-var message></div>
        </dtml-if>
       
        ユーザー<input name="name" type="text"/> <br />
        パスワード<input name="password" type="text"/>
        <input type="submit" name="submit" value="ログイン" />

        </form>
<dtml-var standard_html_footer >
main_html
<dtml-var standard_html_header >

<dtml-var "REQUEST.SESSION.get('login_user')['name']">
さんでログイン中:
<a href="./logout">ログアウト</a>

<dtml-var standard_html_footer >
logout_html
<dtml-var standard_html_header >

<dtml-if message>
<dtml-var message>
</dtml-if>

<dtml-var standard_html_footer >

http://kapi.jp/kapi_blog/134

2008年04月15日

関連カテゴリ Zope

この記事のコメント

この記事にコメントする