背景
仕事でadminサイトへのへログイン可能なユーザ権限を変更する必要があった。
通常だと、Djangoが認証で利用するユーザーモデルのis_staffを利用するが、今回はis_staffを利用しない方法で行う。
あまり良い記事が見つからなかったため執筆。
環境
Django==3.0.6
内容
Djangoのadminサイトへのアクセス権限は以下のメソッドで行われているよう。
通常だとis_activeとis_staffがTrueのユーザを認証していますね。
django/contrib/admin/sites.py
class AdminSite:
...
def has_permission(self, request):
"""
Return True if the given HttpRequest has permission to view
*at least one* page in the admin site.
"""
return request.user.is_active and request.user.is_staff
...
adminサイトへのアクセス権限を変更するためにはhas_permission()をオーバーライドします。has_permisson()内で独自の認証ロジックを作成し、戻り値としてTrue or Falseを返します。作成したMyAdminSiteを管理サイトとして設定します。(MyAdminConfig)
※今回はプロジェクトの設定ディレクトリにadmin.pyとして配置しましたが、どこでも構いません。
from django.contrib.admin.sites import AdminSite
from django.contrib.admin.apps import AdminConfig
class MyAdminSite(AdminSite):
def has_permission(self, request):
return "custom permission logic here"
class MyAdminConfig(AdminConfig):
default_site = 'config.admin.MyAdminSite'
settings.INSTALLED_APPSのadminを作成したMyAdminConfigに変更するのも忘れずに
INSTALLED_APPS = [
# 'django.contrib.admin'
'config.admin.MyAdminConfig',
...
]