さらにシンプルにするために その1
2008年11月24日
ごく初めのころ、次のように書いた。
最初にどんな特徴を持たせるかを考えたとき、テンプレートを廃止して、スキンを多層化しようと思っていたのだが、これが大間違いなアイデアであることが判明した。そもそも、スキンとテンプレートは全く別のもので、テンプレートの概念をスキンに入れ込んでしまうことなど不可能だった。それに、Nucleusのスキンは、parsedinclude などの機能で、すでに多層化が実現している。
始め、テンプレートの概念を廃止しようとして、次にそれが無理であると結論していた。で、再度、テンプレートとスキンの概念を統合しようとしている。以前無理だと考えていたことが可能かもしれないという結論になった背景には、実際にコードを書いてみてテンプレートとスキンの機能を比較することが出来るようになったことがある。
viewクラス(旧jitクラス)には、parse_skin, parse_template, parse_itemという、3つのパース用のメソッドがある。これらを統合して、一つにできないかと考えている。つまり、スキンもテンプレートもアイテムも、すべて同じオブジェクトとして扱うことができないかということ。
この考え方を導入する前に、一つ決定しておきたいことがある。アイテム(個々のブログ記事)がスキンと同じように扱われると言うことは、アイテムが書けるメンバーは、スキンが書けるメンバーと同じ権限を有することになる。すなわち、以前議論したことなのであるが、ここで権限の問題が出てくる。もっとも簡便な方法は、『アイテムが記述できる』イコール『最高権限』という考え方であろう。これを導入することにする。これにより、セキュリティ関連のコードの簡略化が見込めるし、権限昇格系のセキュリティーホールについてほとんど考える必要が無くなる。具体的には、次のようにしたい。
1)ログイン可能なアカウントの種類は2つで、superadmin 及び、guest。
2)superadminアカウントは、1つだけでなく複数を登録可能。
3)superadminはすべての権限を有する。guestは、主にコメント書き込みのためのアカウント。
4)superadminは、管理画面のスキンを選択できる。これにより、低機能でシンプルな管理画面や、フル装備の管理画面など、ニーズに応じた管理画面を操作することが出来る。
このような仕様にすることで、次のようなメリットがある。
1)viewクラスでパースされるオブジェクトはすべてsuperadminが書いたものなので、安心してパースできる。
2)現在のNucleusのニーズにほぼ答えることができる。SNSのようなサイト構築には、コメント機能を用いたNucleus::subSilverのような形態を利用するべき。
3)誤操作で取り返しのつかないようなことをしてしまいそうなユーザや、記事を書くだけの最小限の機能だけ必要とするユーザには、機能限定の管理画面で対処出来る。
デメリットは、次の通り。
1)アイテムを記述できるユーザはすべて最高権限を有するので、たった一人のユーザがクラッカーに攻撃されて乗っ取られてしまうと、即最高権限の奪取につながる。
2)guestアカウントの細かな権限管理が難しい。
要するに、『自分のためのCMS』という考え方に立ち返って、私自身のブログと妻のブログがJeansで構築できれば、それでよいのだ。上記仕様はそれを満たしているし、すべてとは言わないまでも多くのNucleusユーザが受け入れられる仕様だと思う。
最初にどんな特徴を持たせるかを考えたとき、テンプレートを廃止して、スキンを多層化しようと思っていたのだが、これが大間違いなアイデアであることが判明した。そもそも、スキンとテンプレートは全く別のもので、テンプレートの概念をスキンに入れ込んでしまうことなど不可能だった。それに、Nucleusのスキンは、parsedinclude などの機能で、すでに多層化が実現している。
始め、テンプレートの概念を廃止しようとして、次にそれが無理であると結論していた。で、再度、テンプレートとスキンの概念を統合しようとしている。以前無理だと考えていたことが可能かもしれないという結論になった背景には、実際にコードを書いてみてテンプレートとスキンの機能を比較することが出来るようになったことがある。
viewクラス(旧jitクラス)には、parse_skin, parse_template, parse_itemという、3つのパース用のメソッドがある。これらを統合して、一つにできないかと考えている。つまり、スキンもテンプレートもアイテムも、すべて同じオブジェクトとして扱うことができないかということ。
この考え方を導入する前に、一つ決定しておきたいことがある。アイテム(個々のブログ記事)がスキンと同じように扱われると言うことは、アイテムが書けるメンバーは、スキンが書けるメンバーと同じ権限を有することになる。すなわち、以前議論したことなのであるが、ここで権限の問題が出てくる。もっとも簡便な方法は、『アイテムが記述できる』イコール『最高権限』という考え方であろう。これを導入することにする。これにより、セキュリティ関連のコードの簡略化が見込めるし、権限昇格系のセキュリティーホールについてほとんど考える必要が無くなる。具体的には、次のようにしたい。
1)ログイン可能なアカウントの種類は2つで、superadmin 及び、guest。
2)superadminアカウントは、1つだけでなく複数を登録可能。
3)superadminはすべての権限を有する。guestは、主にコメント書き込みのためのアカウント。
4)superadminは、管理画面のスキンを選択できる。これにより、低機能でシンプルな管理画面や、フル装備の管理画面など、ニーズに応じた管理画面を操作することが出来る。
このような仕様にすることで、次のようなメリットがある。
1)viewクラスでパースされるオブジェクトはすべてsuperadminが書いたものなので、安心してパースできる。
2)現在のNucleusのニーズにほぼ答えることができる。SNSのようなサイト構築には、コメント機能を用いたNucleus::subSilverのような形態を利用するべき。
3)誤操作で取り返しのつかないようなことをしてしまいそうなユーザや、記事を書くだけの最小限の機能だけ必要とするユーザには、機能限定の管理画面で対処出来る。
デメリットは、次の通り。
1)アイテムを記述できるユーザはすべて最高権限を有するので、たった一人のユーザがクラッカーに攻撃されて乗っ取られてしまうと、即最高権限の奪取につながる。
2)guestアカウントの細かな権限管理が難しい。
要するに、『自分のためのCMS』という考え方に立ち返って、私自身のブログと妻のブログがJeansで構築できれば、それでよいのだ。上記仕様はそれを満たしているし、すべてとは言わないまでも多くのNucleusユーザが受け入れられる仕様だと思う。
コメント
Kat (2008年12月12日 11:46:30)
権限の管理は、アクション周りおよび、管理画面表示用のスキン変数で必要。どう管理するか少し思いついたので、メモ。
権限管理が必要なコードを記述するためのクラスは、adminクラスやguestクラスなどから派生させると良い。例えば、admin::init()でcore::isAdmin()をチェックするという簡単なことで、すべてを制御できそうである。
権限管理が必要なコードを記述するためのクラスは、adminクラスやguestクラスなどから派生させると良い。例えば、admin::init()でcore::isAdmin()をチェックするという簡単なことで、すべてを制御できそうである。
Kat (2008年12月14日 19:54:47)
上記方法を取り入れ、adminクラスを作成した。管理用のクラスは、adminから派生させる。なお、admin::init()に、ログインチェックだけでなくリファラーノチェックも入れたので、簡単なCSRF対策にもなっている。
これに伴い、以前ja_xxxxとして特別扱いしていたクラスの命名規則を廃止した。adminクラスを継承するだけで良い。管理関連のクラスはすべて、libs/admin/ディレクトリに収める予定。したがって、クラス名はadmin_xxxとなる。
これに伴い、以前ja_xxxxとして特別扱いしていたクラスの命名規則を廃止した。adminクラスを継承するだけで良い。管理関連のクラスはすべて、libs/admin/ディレクトリに収める予定。したがって、クラス名はadmin_xxxとなる。