RBACアクセス制御

48 views
Skip to first unread message

kkawashima

unread,
Feb 8, 2012, 9:41:44 AM2/8/12
to web2py japan
チュートリアルの件ではお世話になりました川島です。
さっそくぽちぽちやってみてるところです。

どうにも理解できないのでどなたか手助けくださいませんか。
https://sites.google.com/site/web2pyjapan/book/08
を読んでいてRBAC制御についてなんとなく理解できましたが、
auth_group,auth_membership,auth_permissionの関係がよくわかりません。
今のとこの理解だと
auth_userはいくつかのgroupに属していてそのグループには何かしらのパーミッションが設定されてる
例えるとユーザの太郎さんは運転手というグループに属していて運転免許というパーミッションを持ってる(という感じでしょうか)なので太郎さんは運転が
できる。
ではメンバーシップとはどのように関わってくるのでしょうか。

あとロールという言葉が出てきたときはグループのことを指していると思って間違いないでしょうか。
何かすっごい勘違いしていたらすみません。。。

中垣健志

unread,
Feb 8, 2012, 10:07:52 AM2/8/12
to web2py...@googlegroups.com
中垣です。
その章は自分が翻訳したのですが、正直よくわかっていないところもありますw。そんな中でも「こうじゃないかな」と思うところで回答してみます。間違いがあれば指摘してください
>> みなさま

「ユーザーの太郎さんは運転手というグループに属している」というのはOKだと思います。
しかし「運転免許」というパーミッションは太郎さんではなく運転手というグループに与えられているものです。なので太郎さんは、運転手というグループに属している間は車を運転できますがグループを外れると運転できなくなります。
また、メンバーシップはユーザーとグループの多対多の関連を表すための概念です。多対多とは、「太郎さんは運転手にも船舶運転手にも属している」し「太郎さんと次郎さんは運転手に属している」みたいなものです。
そしてここでの運転手という概念は一般的な用語としてはロールですが、web2pyではそれをグループと呼んでいると思ってもらっていいと思います。

2012年2月8日23:41 kkawashima <gs2s...@gmail.com>:

--
NAKAGAKI Kenji
mail:nakak...@gmail.com
twitter:@nakaken0629
facebook:http://www.facebook.com/nakaken0629

kato

unread,
Feb 8, 2012, 1:32:26 PM2/8/12
to web2py...@googlegroups.com
川島さん

中垣さんが書かれていることで大体合っているのですが、web2py では グループとロールは全く同一ではありません。
アクセス制御のテーブル関連図を確認してもらえれば分かるのですが、グループテーブルのフィールドとしてロールが存在します。

実装でどのようにするかで決まりますが、 auth.has_membership(group_id, user_id, role)  というメソッドがあります。
このメソッドはユーザIDがどのグループIDに属しているか、もしくはどのロールに属しているかを判定します。
ロールを指定した場合は更に auth.id_group(role) を呼んで、どのグループに属しているか判定します。

つまりロールはグループを越える概念として存在しています。しかし現実の auth.id_group(role) は、同じロールを持っている
グループが複数存在する場合、最初のグループしか判定しません。

このためロールを使って難しい設定をすると、上手く動かない可能性があります。グループ単位で制御するというのが、
現実的な実装方法だと思います。

kato

2012年2月9日0:07 中垣健志 <nakak...@gmail.com>:

kkawashima

unread,
Feb 9, 2012, 9:33:25 AM2/9/12
to web2py japan
中垣さん katoさん

分かりやすい説明ありがとうございます。すっごいすっきりしました。
ロールはグループテーブルのフィールドの一つだったとは・・・ロールバックアクセスコントロールという名前に惑わされていましたがそういう事だったんで
すね。
自分のタラの頭じゃロールの上手な使い方を実装含めて考えつかないのでおとなしくグループ単位での制御で考えてみます。

あと自分はとりあえずGAE環境です。たとえば使うことが前提のグループなどauth.add_group('driver', 'common
driver')の処理はアップロードしたら最初にしておきたいと思っています。
そういう初期化ファイルなどはweb2pyの中には存在しますか?db.pyあたりで処理すべきでしょうか?

On Feb 9, 3:32 am, kato <hi21alt...@yahoo.co.jp> wrote:
> 川島さん
>
> 中垣さんが書かれていることで大体合っているのですが、web2py では グループとロールは全く同一ではありません。
> アクセス制御のテーブル関連図を確認してもらえれば分かるのですが、グループテーブルのフィールドとしてロールが存在します。http://docs1.erp2py.com/web2py_ac/summary/summary.html#id5
>
> 実装でどのようにするかで決まりますが、 auth.has_membership(group_id, user_id, role)
> というメソッドがあります。
> このメソッドはユーザIDがどのグループIDに属しているか、もしくはどのロールに属しているかを判定します。
> ロールを指定した場合は更に auth.id_group(role) を呼んで、どのグループに属しているか判定します。
>
> つまりロールはグループを越える概念として存在しています。しかし現実の auth.id_group(role) は、同じロールを持っている
> グループが複数存在する場合、最初のグループしか判定しません。
>
> このためロールを使って難しい設定をすると、上手く動かない可能性があります。グループ単位で制御するというのが、
> 現実的な実装方法だと思います。
>
> kato
>
> 2012年2月9日0:07 中垣健志 <nakaken0...@gmail.com>:
>
>
>
>
>
>
>
> > 中垣です。
>
> > その章は自分が翻訳したのですが、正直よくわかっていないところもありますw。そんな中でも「こうじゃないかな」と思うところで回答してみます。間違いがあれば 指摘してください
> > >> みなさま
>
> > 「ユーザーの太郎さんは運転手というグループに属している」というのはOKだと思います。
>
> > しかし「運転免許」というパーミッションは太郎さんではなく運転手というグループに与えられているものです。なので太郎さんは、運転手というグループに属してい る間は車を運転できますがグループを外れると運転できなくなります。
>
> > また、メンバーシップはユーザーとグループの多対多の関連を表すための概念です。多対多とは、「太郎さんは運転手にも船舶運転手にも属している」し「太郎さんと 次郎さんは運転手に属している」みたいなものです。
> > そしてここでの運転手という概念は一般的な用語としてはロールですが、web2pyではそれをグループと呼んでいると思ってもらっていいと思います。
>
> > 2012年2月8日23:41 kkawashima <gs2saf...@gmail.com>:
> > > チュートリアルの件ではお世話になりました川島です。
> > > さっそくぽちぽちやってみてるところです。
>
> > > どうにも理解できないのでどなたか手助けくださいませんか。
> > >https://sites.google.com/site/web2pyjapan/book/08
> > > を読んでいてRBAC制御についてなんとなく理解できましたが、
> > > auth_group,auth_membership,auth_permissionの関係がよくわかりません。
> > > 今のとこの理解だと
> > > auth_userはいくつかのgroupに属していてそのグループには何かしらのパーミッションが設定されてる
> > > 例えるとユーザの太郎さんは運転手というグループに属していて運転免許というパーミッションを持ってる(という感じでしょうか)なので太郎さんは運転が
> > > できる。
> > > ではメンバーシップとはどのように関わってくるのでしょうか。
>
> > > あとロールという言葉が出てきたときはグループのことを指していると思って間違いないでしょうか。
> > > 何かすっごい勘違いしていたらすみません。。。
>
> > --
> > NAKAGAKI Kenji
> > mail:nakaken0...@gmail.com

Omi Chiba

unread,
Feb 9, 2012, 9:50:58 AM2/9/12
to web2py japan
> そういう初期化ファイルなどはweb2pyの中には存在しますか?db.pyあたりで処理すべきでしょうか?
それでいいと思います。Modelsに入れるとグローバルな値になるのでいつでも参照可能です。ごちゃごちゃするときは新しいファイルをModelsの
中に作成して分けたりします。例えば私はテーブルの定義は、db_table.pyとして別ファイルにしています。

余談ですが、Modelsの中のファイルはファイル名の昇順で読み込まれていくので、本当に初期化ファイルという意味で、0.pyというファイルを作成
する場合をちらほら見かけます。この場合、db.pyが読み込まれるまえに処理されます。

kkawashima

unread,
Feb 15, 2012, 12:15:27 AM2/15/12
to web2py japan
ありがとうございます。

Models/0.pyが一番早く読み込まれる。φ(`д´)メモメモ...普通当たり前なのかもしれないけど、知らないからこういう情報が目からウロ
コです。
Reply all
Reply to author
Forward
0 new messages