6

私は、さまざまな学校がコンテンツをオンラインで管理できるようにする製品に取り組んでいます。

これには、私が自分で書いた役割ベースのアクセス制御ロジックの設定が含まれます。基本的に、各学校には、独自の権限セットを持つ独自のロール セットがあります。ソフトウェアのユーザーは、いつでも異なる役割を持つ複数の学校に所属することができます。

さまざまな理由から、私はこれを捨てて、代わりに Django の Groups and Permissions をdjango-guardian のようなライブラリと一緒に使用したいと考えています。私が直面している問題は、新しい学校ごとに外部キーを含め、Django や django-guardian などのライブラリでヘルパー メソッドを使用できるように、グループ モデルを拡張する方法です。

私が思いついた可能性のあるアプローチの 1 つは、「School 1 - Admin」、「School 1 - Teacher」、「School 2 - Admin」、「School 2 - Teacher」などのイベント名に基づいてグループを作成し、それに基づいてアクセス許可をクエリすることです。代わりにこれ。このようにしてはいけない正当な理由はありますか?

4

2 に答える 2

5

詳しく調べてみると、django-guardian は私のニーズを解決することができました。ここに完全な実装について書きました: http://pragmaticstartup.wordpress.com/2012/06/26/django-guardian-a-full-access-control-logic-acl-example/

于 2012-07-04T08:44:37.577 に答える
0

両方のアプローチを組み合わせてみませんか?Djangoモデルは継承を可能にします。まずRole、許可された役割と学校モデルを使用してモデルを定義します。

django.contrib.auth.Group次に、たとえばGroupRoleから新しいモデルを継承できます。Djangoは、制約のある適切なグループへの外部キーを持つグループに元々含まれていないプロパティのみを含む、モデルの新しいdbテーブルを作成します。さらに良いことに、元のグループモデルとの自動逆関係が得られるため、次のように記述できます。

class GroupRole(Group):
    role = models.ForeignKey(Role)
    school = models.ForeignKey(School)
    ...

g = Group.objects.get(id=1)
# you can access standard group items here g.<attribute> or g.grouprole.<attribute>
# you can access GroupRole attributes by doing g.grouprole.<some_attribute>

GroupRole.objects.filter(role__type='admin', school__location__state='NY')

おもしろいことに、関係は反映されているので、あまり役に立たない場合は、次のようなものが有効です。

g.grouprole.grouprole.grouprole.grouprole.role

grouproleプロキシが関連付けられていないベースグループインスタンスを取得すると、例外がスローされます。

g = Group.objects.create(name='myplaingroup')
try:
    print g.grouprole
except GroupRole.DoesNotExist:
    print 'This is a normal group'

または、この動作をオーバーライドして、例外を発生させる代わりにNoneを返すか、代わりにデフォルトのGroupRoleを提供することもできます。

于 2012-06-19T12:32:54.697 に答える