Django — интегрированный единый вход CAS

Django

Введение в CAS

CAS расшифровывается как Central Authentication Service (Центральная служба аутентификации), которая представляет собой средство реализации единого входа (SSO).

Схема обмена данными CAS выглядит следующим образом (картинка взята из Google Gallery):

CAS通讯流程图

Для воспринимаемого пользователем уровня этой статьи процесс аутентификации выглядит следующим образом:

  1. Внешний интерфейс входа в систему
  2. Бэкенд возвращает страницу входа, перенаправленную на сервер CAS, и содержит ссылку на веб-страницу, к которой обращается текущий пользователь.
  3. Пользователь входит в систему, и браузер отправляет запрос на сервер CAS для аутентификации.
  4. Аутентификация CAS пройдена, сохраните этот логин в сеансе и верните адрес обратного вызова на серверную часть.
  5. Бэкэнд возвращает запрос на перенаправление во внешний интерфейс
  6. Внешний интерфейс перенаправляет на страницу перед входом в систему

Логика обработки TGT, используемая в середине, была реализована клиентом CAS с открытым исходным кодом (python-cas).

Следует отметить, что сам сервер CAS имеет некоторые условия фильтрации, такие как белый список доменных имен и т. д. Поэтому доменное имя или IP новой системы необходимо добавить в конфигурацию сервера CAS при доступе.

Из соображений безопасности CAS обычно не поддерживает междоменное взаимодействие, поэтому разделение клиентской и серверной разработки может быть проблематичным. (кажется есть решение, но не пробовал)

Доступ к CAS

Поскольку это первый раз, когда я связываюсь с CAS, чтобы облегчить отладку, я напрямую запускаю сервер CAS локально для отладки.

Клиент CAS также интегрирован в код Django, который мы фактически разрабатываем.

CAS-сервер

В GitHub есть много проектов CAS, я выбрал один на основе Django.django-mama-casприменение.

настроить

Создайтеdjango-cas-serverпроект:

django-admin startproject django-cas-server

Установитьdjango-mama-casполагаться:

pip install django-mama-cas

существуетINSTALLED_APPSдобавлено в'mama_cas'применение:

settings.py

INSTALLED_APPS = [
    ...
    'mama_cas',
]

Добавить кmama_casМаршрутизация в приложении:

urls.py

urlpatterns += [url(r'', include('mama_cas.urls'))]

Чтобы настроить информацию CAS:

MAMA_CAS_SERVICES = [
    {
        # 必填项,此项为**Client** IP:Port,相当于白名单
        'SERVICE': 'http://127.0.0.1:8000',
        # 回调模式,具体参考官方文档
        'CALLBACKS': [
            'mama_cas.callbacks.user_model_attributes',
        ],
    },
]

использовать

# 使用任意端口都可,此处我使用 30000
python manage.py runserver 0.0.0.0:30000

После запуска службы вы можете получить доступhttp://0.0.0.0:30000/loginПерейдите на страницу входа в CAS.

Вопрос какой логин и пароль?

Мне действительно потребовалось некоторое время, чтобы понять это...django-mama-casПо умолчанию используетсяdjango.authмодульUser,использоватьdjango-adminСоздайте суперпользователя, которого также можно использовать для входа в CAS:

python manage.py createsuperuser

Введите пароль пользователя, чтобы завершить создание суперпользователя, а затем используйте этого пользователя для входа в систему.

CAS-клиент

Python имеет клиент CAS с открытым исходным кодомpython-cas, поскольку я использую серверную часть разработки Django, я напрямую выбираю ее инкапсулироватьpython-casПриложение Джангоdjango-cas-ng.

настроить

Также необходимо сначала установить зависимости:

pip install django-cas-ng

существуетsettings.pyсерединаINSTALLED_APPSиAUTHENTICATION_BACKENDSдва дополненияdjango-cas-ngКонфигурация:

settings.py

INSTALLED_APPS = (
    # ... other installed apps
    'django_cas_ng',
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'django_cas_ng.backends.CASBackend',
)

В то же время обратитесь к адресу CAS и версии, к которой нужно получить доступ, и добавьте несколько соответствующих конфигураций:

# CAS 的地址
CAS_SERVER_URL = 'http://127.0.0.1:30000'
# CAS 版本
CAS_VERSION = '3'
# 存入所有 CAS 服务端返回的 User 数据。
CAS_APPLY_ATTRIBUTES_TO_USER = True

Добавьте маршруты входа и выхода (эти две части логики былиdjango-cas-ngЗавершено и может быть использовано напрямую. Если вам нужно расширить, вы можете обратиться к исходному коду, чтобы реализовать его самостоятельно):

urls.py

import django_cas_ng.views as cas_views
urlpatterns = [
    ...
    path('login/', django_cas_ng.views.LoginView.as_view(), name='cas_ng_login'),
    path('logout/', django_cas_ng.views.LogoutView.as_view(), name='cas_ng_logout'),
]

отладка

Запустите текущую службу:

python manage.py runserver

доступhttp://127.0.0.1:8000/login, страница перейдет кhttp://127.0.0.1:30000/login?service=http://127.0.0.1:8000Страница входа в CAS (обратите внимание, что порт другой), она вернется после успешного входа.

Суммировать

Логику самого CAS нужно понимать, но ведь это зрелая архитектура единого входа.Вообще-то есть реализации клиента с открытым исходным кодом, и объем кода не большой.Достаточно отладить и обратиться к конфигурация документа.

Ссылаться на