管理者から、ユーザーまたはユーザーグループに権限を割り当てて、モデルからのデータの追加、変更、削除を許可できることがわかりました。
これはすばらしいことですが、ユーザーまたはユーザーグループにビューのグループへのアクセスを許可するかどうかも許可する必要があります。 Webサイトに特定の種類のサービスがあるので、一部のユーザーに特定のサービス(ページ/ビュー)へのアクセスを許可し、他のユーザーには許可を与えたくない。
では、特定のユーザー/ユーザーグループに特定のビューへのアクセスを許可するにはどうすればよいですか?ありがとうございました!
特定のモデルを追加または変更できないユーザーは、管理者にそのモデルを表示できません。
カスタム作成されたビューについて話している場合は、ユーザーのアクセス許可を確認し、そのアクセス許可がない場合は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):
# ...
権限を使用すると、管理インターフェースを使用するだけで、ユーザーやグループに対してそれらを簡単に追加または削除できます。
これは手動で管理する必要がありますが、とても簡単です。おそらく、グループがビューを表示する権限を持っているかどうかを決定する属性があります。ユーザーが特定の権限を持っているかどうかの単純な質問である場合は、_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 はかなり包括的です。
クラスベースのビューの場合、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つの選択肢が最善の選択肢だと思います。
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
を実行することを忘れないでください。
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
の特別なケースであり、ユーザーが指定された権限を持っているかどうかをテストするために特別に設計されています。