いくつかのアプリを使ったDjangoプロジェクトがあります。特定のユーザーのアクセスを1つの特定のアプリのみに制限し、ユーザーの作成時に、つまり、views.py
などのデコレータを使用してすべてのメソッドを変更する必要はありません@permission_required
。
これは可能ですか?つまり、ユーザー「A」がアプリ「Y」のコードを変更せずにアプリ「X」のみを使用できることを宣言することは可能ですか?
いくつかのアプリを使ったDjangoプロジェクトがあります。特定のユーザーのアクセスを1つの特定のアプリのみに制限し、ユーザーの作成時に、つまり、views.py
などのデコレータを使用してすべてのメソッドを変更する必要はありません@permission_required
。
これは可能ですか?つまり、ユーザー「A」がアプリ「Y」のコードを変更せずにアプリ「X」のみを使用できることを宣言することは可能ですか?
メソッドを実装するミドルウェアを作成してprocess_view
から、ビュー関数がどのアプリに属しているかを確認できます。
たとえば、これはあなたがそれを行うことができる1つの(潜在的にバグのある)方法です:
class RestrictAppMiddleware(object):
def process_view(self, request, view_func, *args, **kwargs):
view_module = view_func.__module__
allowed_apps = apps_visible_to_user(request.user)
if not any(app_name in view_module for app_name in allowed_apps):
return HttpResponse("Not authorized", status=403)
明らかに、ヒューリスティックを改善する必要があり(たとえば、これにより、ユーザーは「foo」ビュー「foobar」にもアクセスできるようになります)、Djangoの組み込みビューに依存するアプリを検討する必要があります(例、direct_to_template
)…しかし、これは私のやり方です。