web-dev-qa-db-ja.com

Django-特定のビューへのユーザー権限?

管理者から、ユーザーまたはユーザーグループに権限を割り当てて、モデルからのデータの追加、変更、削除を許可できることがわかりました。

これはすばらしいことですが、ユーザーまたはユーザーグループにビューのグループへのアクセスを許可するかどうかも許可する必要があります。 Webサイトに特定の種類のサービスがあるので、一部のユーザーに特定のサービス(ページ/ビュー)へのアクセスを許可し、他のユーザーには許可を与えたくない。

では、特定のユーザー/ユーザーグループに特定のビューへのアクセスを許可するにはどうすればよいですか?ありがとうございました!

22
avatar

特定のモデルを追加または変更できないユーザーは、管理者にそのモデルを表示できません。

カスタム作成されたビューについて話している場合は、ユーザーのアクセス許可を確認し、そのアクセス許可がない場合は404を返すものを作成できます。権限はモデルにリンクされ、グループにはさまざまな権限を割り当てることができます。

次のようにモデルに権限を追加できます。

# myproject/myapp/models.py

class MyModel(models.Model):
    class Meta:
        permissions = (
            ('permission_code', 'Friendly permission description'),
        )

次に、ユーザーが次のような権限を持っているかどうかを確認できます。

@user_passes_test(lambda u: u.has_perm('myapp.permission_code'))
def some_view(request):
    # ...

権限を使用すると、管理インターフェースを使用するだけで、ユーザーやグループに対してそれらを簡単に追加または削除できます。

24
Marcus Whybrow

これは手動で管理する必要がありますが、とても簡単です。おそらく、グループがビューを表示する権限を持っているかどうかを決定する属性があります。ユーザーが特定の権限を持っているかどうかの単純な質問である場合は、_permission_required_デコレータでそのビューを装飾するか、_user_passes_test_もう少し複雑な場合:

_@user_passes_test(lambda u: u.is_allowed_to_see_view_myview())
def myview(request):
    ...etc...
_

_is_allowed_to_see_view_myview_がUserオブジェクトのある種のメソッドであると仮定します。

authentication docs はかなり包括的です。

10
Daniel Roseman

クラスベースのビューの場合、UserPassesTestMixinクラスをビューに継承し、test_funcを定義できます。

from Django.contrib.auth.mixins import UserPassesTestMixin

class MainView(UserPassesTestMixin, View):

    def test_func(self):
        return self.request.user.has_perm('app.get_main_view')

これを使用する方法の詳細については、 このドキュメント を参照してください。

2
nesdis

権限システムはモデル中心であり、権限がモデルに関連付けられていることを前提としています。次の2つの選択肢が最善の選択肢だと思います。

A.ビューが特定のモデルに関連している場合は、Marcus Whybrowが提案したように、そのモデルでカスタム権限を使用してください。

B. [テストされていません。動作しない可能性があります]サブクラスUserを作成し、そこで独自の権限を定義します。実際のモデルは必要ありません。これは、アプリのカスタム権限のラッパーです。

from Django.contrib.auth.models import User
class MyUser(User):
    class Meta:
        permissions = (('can_visit_$viewset1', 'Can visit $view_set_1'))

データベースにカスタム権限を追加するには、syncdbを実行することを忘れないでください。

1

Django 1.9+を使用している場合は、PermissionRequiredMixinを使用できるはずです: https://docs.djangoproject.com/en/1.9/topics/ auth/default /#Django.contrib.auth.mixins.PermissionRequiredMixin

例えば:

from Django.contrib.auth.mixins import PermissionRequiredMixin

class MainView(PermissionRequiredMixin, View):
    permission_required = 'my_services.foo_bar'
    ...

これは基本的にUserPassesTestMixinの特別なケースであり、ユーザーが指定された権限を持っているかどうかをテストするために特別に設計されています。

1
Stephen G Tuggy