#背景
前提記事:Django + Shibboleth with RemoteUserMiddleware
Shibboleth認証が通って、http://localhost/admin
にアクセスできたと思ったら、Djangoのログインができない(そんなユーザー存在しないようなことを言われる)。
#原因
公式ドキュメント曰く、
Be aware that this particular setup disables authentication with the default ModelBackend. This means that if the REMOTE_USER value is not set then the user is unable to log in, even using Django’s admin interface.
この設定は通常のModelsBackendによる認証を無効化してしまうので気を付けてください。例えば、REMOTE_USERがセットされていない場合、Django adminを含めてユーザーは全くログインできなくなってしまいます。
Adding 'django.contrib.auth.backends.ModelBackend' to the AUTHENTICATION_BACKENDS list will use ModelBackend as a fallback if REMOTE_USER is absent, which will solve these issues.
解決法としては、AUTHENTICATION_BACKENDS に'django.contrib.auth.backends.ModelBackend'を追加することによって、REMOTE_USERがセットされなかった場合のフォールバックとしてModelBackendを使用することができるようになります。
##解決策
ModelBackendを追加。
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.RemoteUserBackend',
'django.contrib.auth.backends.ModelBackend', # ←追加
)
#参考:admin画面をShibbolethから除外したい
例えばドメインがhttp://localhost/
だとすると、admin画面にアクセスするためのhttp://localhost/admin/
でもShibboleth認証が動いてしまう。admin画面にアクセスする権限をShibboleth認証とは切り離したい場合は邪魔になる(現状では、Shibboleth認証でログインしてから、続けてDjangoの認証画面が出てくる)。
##方策
アプリの特定のロケーションのみShibboleth管理下から外す。
<Location /admin>
AuthType None
Require all granted
</Location>
<Location /static>
AuthType None
Require all granted
</Location>
注意:<Location /admin/>
(最後に'/'がついている)としてしまうと、http://localhost/admin
(最後に'/'がない)はShibboleth認証の管理下に置かれてしまう。
注意:admin画面で用いるcssファイルにShibboleth認証がかかってしまうのを防ぐため、/static
も管理下から外す必要がある。ただしこの設定では/static
は完全に公開されてしまうので、Djangoのログイン画面に関係のないコンテンツの画像などにもアクセスできるようになってしまい正直おすすめできない。本来は公開用のstaticを分けて設けるなどしたほうがよい。
以上。