[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kahua-dev:01236] Re: <kahua-user> の拡張



ユーザオクラスを拡張したい場合に,<kahua-user>クラスを継承した
クラスを定義できるかについては,以前にも議論があって,
その時は,継承はしないで<kahua-user>インスタンスへの参照を持つのが
良いんじゃないかって事になったと思います.

でも,この方法だとkahua-current-userとかkahua-add-userのAPIを使えないので
同じような仕組みを独自に実装する必要があって面倒でした.

昨日のGaucheFestで「やっぱり<kahua-user>クラスを継承してかつKahuaが提供する
ユーザAPIを使いたい」って話しが出て,<kahua-user>クラスの継承をサポートする
ようになりました.

拡張ユーザクラスを定義する時は,普通に*.kahua内で
(define-clas <my-kahua-user> (<kahua-user>)
  ((e-mail :allocation :persistent)))
とするだけです.
<kahua-user>クラスを継承するクラスを定義した時点で
kahua.userモジュールが提供するAPIはユーザクラスとして<my-kahua-user>クラスを
使うようになります.
同様にkahua.serverモジュールにある(kahua-current-user)の返り値も
<my-kahua-user>インスタンスになります.

継承した場合の欠点は,ワーカ間でDBを共有していてもユーザ情報を共有できなくなる事です.

柴田

On Tue, 9 Aug 2005 00:33:11 +0900
SHIBATA Tomohisa <t0m0h1s4@xxxxxxxxxxxx> wrote:

> こんばんは,柴田です.
> 
> <kahua-user>を継承するのではなく,login-nameで対応付けた
> 別のクラス<hoge-user>を作るのはどうでしょうか.
> 
> ログインには<kahua-user>を使い,ログイン後はlogin-nameから
> 引っ張ってきた<hoge-user>を使う感じです.
> <hoge-user>をアプリケーション毎に用意すれば様々な情報を追加
> できます.
> 
> あと,認証は<kahua-user>を使うので,1つのidとpasswordで
> 複数のアプリケーションにログインできるかも…
> ;; ZOPE・Ploneのユーザ管理部分がこんなんでした.
> 
> <kahua-user>はシンプルであって欲しいです.
> 
> 〜<イメージ>〜
> (define-class <hoge-user> (<kahua-persistent-base>)
>   ((login-name    :allocation :persistent
>                   :init-keyword :login-name :init-value #f)
>    (fullname      :allocation :persistent
>                   :init-keyword :fullname :init-value #f)
>    (group-alist   :allocation :persistent
>                   :init-keyword :group-alist :init-value '())
>    (kahua-user    :allocation :persistent
>                   :init-keyword :kahua-user :init-value #f)
>    ))
> 
> (define-method key-of ((self <hoge-user>))
>   (ref self 'login-name))
> 
> (define (hoge-check-user login-name password)
>   (let ((user (kahua-check-user login-name password)))
>     (and user
>          (or (hoge-find-user login-name)
>              (make <hoge-user>
>                :login-name login-name
>                :kahua-user user)))))
> 
> (define (hoge-find-user login-name)
>   (and (kahua-find-user login-name)
>        (find-kahua-instance <hoge-user> login-name)))
> 
> (define (hoge-add-user login-name password fulllname)
>   (if (hoge-find-user login-name)
>       #f
>     (let ((user (or (kahua-find-user login-name)
>                     (kahua-add-user login-name password))))
>       (make <hoge-user>
>         :login-name login-name
>         :fullname fullname
>         :kahua-user user))))
> 
> (define hoge-current-user
>   (getter-with-setter
>    (lambda ()
>      (let ((user (kahua-current-user)))
>        (and user
>             (find-kahua-instance <hoge-user> (ref user 'login-name)))))
>    (lambda (logname)
>      ((setter kahua-current-user) logname))))
> 
> (define (hoge-user-password-change user old-password new-password)
>   (kahua-user-password-change (ref user 'kahua-user) old-password new-password))
> 
> On Mon, 8 Aug 2005 11:21:29 +0900
> えんどうやすゆき <yasuyuki@xxxxxxxxxxxx> wrote:
> 
> > えんどうです。
> > 
> > ユーザー情報として持たせたい内容はアプリケーションごとに様々です。
> > 
> > たとえばソーシャルネットワークでは「友達リスト」を持たせたいかも 
> > 知れません。
> > このようなとき、<kahua-user>を継承した独自のユーザークラス 
> > を書いたとします。
> > 
> > この独自のユーザークラスを使った会員の登録、認証は、
> > kahua.userモジュールを使って行えば良いでしょうか?
> > 
> > それとも新たなGaucheモジュールやKahuaプラグインを書 
> > くべきでしょうか?
> > 
> > なんか抽象的な質問ですみません。後者の例をお持ちの方はおられます 
> > か?
> > 
> > または、アプリケーションごとの要件に応じてカスタマイズしやすくす 
> > るためには、
> > <kahua-user>はどうあるべきでしょうか?
> > 
> > 
> > 
> > 
> 
>