Django-特定のビューへのユーザー許可?
-
15-10-2019 - |
質問
管理者から、ユーザーまたはユーザーグループに許可を割り当てることができることがわかります。モデルからデータの追加、変更、削除を許可します。
それは素晴らしいことですが、ユーザーまたはユーザーグループがビューのグループにアクセスできるかどうかも許可する必要があります。私は自分の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):
# ...
許可を使用すると、adminインターフェイスを使用してユーザーやグループから簡単に追加または削除できます。
他のヒント
手動で管理する必要がありますが、非常に簡単です。おそらく、グループがビューを見る許可を持っているかどうかを決定する属性があります。次に、そのビューをどちらかで飾るだけです 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
ユーザーオブジェクトのある種の方法です。
認証ドキュメント かなり包括的です。
クラスベースのビューについては、継承できます 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
, 、ユーザーが指定された許可を持っているかどうかをテストするために特別に設計されています。