General

権限管理

2008年1月25日

スキン変数を実装していく段階で、ブログチームの管理部分に行き着いたのであるが、一からCMSを書くのであれば、さまざまな権限を別個に設定できるようにしたい。

今のところ、jeans_loginテーブルにstatusとフィールドを設けていて、ここで各メンバーのステータスを決定することにしている。どんなステータスがあるかは、

SELECT status FROM jeans_login GROUP BY status

で取得できるはず。現在のところは『admin』ステータスだけであるが、『blogadmin』『poweruser』など、さまざまなステータスをここに設定できる。いろいろ考えた結果、権限管理にはもう一つテーブルを作るだけでよさそう。


新たにjeans_authorityというテーブルを作成し、name, statusという2つのフィールドを持たせる。nameには、権限の種類を設定する。あるユーザがある権限を有しているかどうかは、

SELECT COUNT(*) FROM jeans_login as l, jeans_authority as a
WHERE l.id='メンバーID' AND l.status=a.status AND a.name='調べる権限'
LIMIT 1

の結果が1を返すかどうかで調べることが出来るはず。また、jeans_authority_descテーブルを作成し、ここに権限の種類と説明文を登録するようにすれば、プラグインから新たな権限を追加したり出来るかもしれない。

権限としては、次のようなものが考えられるかな?

0)記事やブログ設定でタグが使えるのはsuper-adminのみ
1)super-admin かどうか
2)ログインできるかどうか(canlogin)
3)チームに属するブログの記事を書けるかどうか(post2teamblog)
4)チームに属さないブログの記事を書けるかどうか(post2blogs)
5)チームに属するブログの管理権限があるかどうか(editteamblog)
6)チームに属さないブログの管理権限があるかどうか(editblogs)
7)自分の記事に属するコメントの編集権限(comment4me)
8)チームに属するブログでのコメントの編集権限(comment4teamblog)
9)チームに属さないブログでのコメントの編集権限(comment4allblogs)

追記
一時、思い切って単一ユーザのみの対応にしようかとも思ったけれど、上記のやり方で比較的簡単に権限管理できそうなので複数ユーザ対応にした。Nucleusのようにあらかじめ権限の割り振りを決めておくよりも、ここでのやり方のように、一つ一つ設定できるようにしてユーザに決めてもらったほうが、コードが簡単になる模様。

コメント

藤咲 (2008年1月28日 22:54:47)

チームに属するブログの他人の記事編集権限があるかどうか

チームに属するブログのスキン/テンプレ編集権限があるかどうか
があるといいかも…と思うんですが、後者はNucleusと同じ設計思想にすると難しいですよね…

Kat (2008年1月29日 11:08:37)

なるほど、ブログの管理権限と他人の記事の管理権限を分けて設定したほうがより細かく設定できますね。

スキン/テンプレートの編集権限は、super-adminだけになると思います。というのは、これが編集できるということは、いかなるPHPコードでも実行できることになるからです。

同様な理由で、HTMLタグが書ける(JavaScriptが書ける)権限も、super-adminだけに絞るつもりです。

藤咲 (2008年1月31日 22:28:35)

そうか、セキュリティの問題がありますよね。>スキン/テンプレ編集権限
そうするとスキン等の編集ができるブログサービスってどうやってセキュリティを保ってるんだろう。include系を使えないようにしてるとかでしょうか。

WPなんてもろPHPを書くんですよね?あれのサービスってどうしてるんだろう…。

Kat (2008年2月1日 14:39:10)

うまく構成すれば、そういうこともできないことは無いです。Nucleusの場合だと、それ専用のプラグインを書くことになりますね。

例えばNucleusのブログ管理者だと、いくつかあるスキンの中から、好きなものを選べますよね。それと同じように、スキン内で利用できるパーツをいくつか用意しておき、それらの中から好きなものを選ぶようにすれば良いと思います。

WPの場合、タグを挿入したりテンプレートを変更したりできるのは、super-adminだけのようです。

藤咲 (2008年2月3日 22:39:55)

なるほど、そう考えるとVicunaのようなスキン/テンプレートを標準にしておいて、自分用のCSS編集だけができるようなプラグインとかを作ることで、ある程度のカスタマイズをさせる、って事ができますよね。
スタイルシートに記述される文字列も
http://blog.kansai.com/kdc_help/204
を参考に制御させてしまえばいいわけですし。

Kat (2008年2月4日 10:43:57)

そうです!…といいたいところなのですが、残念ながらCSSの編集を一般ユーザーに許可することは、できないことはないですが、非常に難しいです。

リンク先のCSSのセキュリティー対策では、いわゆるブラックリスト形式ですよね。これは、たった一つ漏れがあるだけでセキュリティーホールになってしまう方法です。特にIEの場合、ブラックリスト形式をすり抜ける、さまざまな方法が報告されています。

CSSに関しても、管理者が複数用意しておいて、その中から選択する形式が良いと思います。

藤咲 (2008年2月4日 21:09:37)

そうなんですね…。
悔しいのでCSSのXSS対策を調べてみたんですが、ホワイトリスト形式の対策ってないですね…。
どこでも引用されるのははてなのXSS対策ですが
http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AA%E3%83%BCXSS%E5%AF%BE%E7%AD%96
これもCSSに関してはブラックリストですしね…。
ほんとになんでCSSにスクリプトを書けるようになってんだと…。
まぁ不特定多数向けサービスに使うことは想定してないわけですし、それでいいといえばいいんでしょうけど、なにか悔しいものが…(笑

コメント送信