という名前の Django サイト用に別のアプリケーションを作成しrestricted
、
http://localhost:8000/restricted/
このアプリケーション全体へのアクセスを、特定のグループ (「制限付きグループ」と呼びましょう) のメンバーのみに制限できるようにしたいと考えています。
これを簡単に行う方法はありますか?おそらくurls.conf
ファイルに?view.py
このアプリはクラスベースのリストビュー (30 以上) でいっぱいなので、ファイル内のすべてのビューにこの種のチェックを適用するのは嫌です。
編集:これを修正するために、ビューに関数を追加しました:
def group_check(user):
if user:
return user.groups.filter(name='Restricted').count() >= 1
return False
通常のビュー ( などindex
) では、デコレータを配置します。
@user_passes_test(group_check)
def index(request):
return render_to_response('listview/index.html')
クラスベースのリストビューの場合:
class MyListView1(ListView):
context_object_name = "objs"
queryset = MyList.objects.all()
template_name = "listviews/mylist.html"
@method_decorator(user_passes_test(group_check))
def dispatch(self, *args, **kwargs):
return super(MyListView1, self).dispatch(*args, **kwargs)
そして、再定義されたクエリセットを持つものの場合:
class MyListView1_Custom(ListView):
context_object_name = "obj"
template_name = "listviews/mylist_custom.html"
@method_decorator(user_passes_test(group_check))
def get_queryset(self):
self.obj1 = get_object_or_404(MyList, id__iexact=self.args[0])
self.context = {}
self.context['custom'] = self.obj1
return self.context
もちろん、これには以下をインポートする必要があります。
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test
テストの結果、これはグループに基づいてビューを保護するのに適した方法であると結論付けました。「Restricted」グループに属していないユーザーは、デフォルトのログイン ページにリダイレクトされます。
詳細については、Django のドキュメント ページuser_passes_testを参照してください。別の場所にリダイレクトする方法も説明されています (必要に応じて、これを使用して 404 にリダイレクトできます)。