Введение в CAS
CAS расшифровывается как Central Authentication Service (Центральная служба аутентификации), которая представляет собой средство реализации единого входа (SSO).
Схема обмена данными CAS выглядит следующим образом (картинка взята из Google Gallery):
Для воспринимаемого пользователем уровня этой статьи процесс аутентификации выглядит следующим образом:
- Внешний интерфейс входа в систему
- Бэкенд возвращает страницу входа, перенаправленную на сервер CAS, и содержит ссылку на веб-страницу, к которой обращается текущий пользователь.
- Пользователь входит в систему, и браузер отправляет запрос на сервер CAS для аутентификации.
- Аутентификация CAS пройдена, сохраните этот логин в сеансе и верните адрес обратного вызова на серверную часть.
- Бэкэнд возвращает запрос на перенаправление во внешний интерфейс
- Внешний интерфейс перенаправляет на страницу перед входом в систему
Логика обработки 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 нужно понимать, но ведь это зрелая архитектура единого входа.Вообще-то есть реализации клиента с открытым исходным кодом, и объем кода не большой.Достаточно отладить и обратиться к конфигурация документа.