Mellophone

Материал из Course Orchestra
Перейти к: навигация, поиск

Общие сведения

Mellophone — компонент платформы КУРС, специализированно решающий задачи аутентификации, кросс-доменной аутентификации, интеграции с различиными провайдерами аутентификации. Хотя в рамках платформы КУРС этот компонент преимущественно используется в связке с Showcase, в действительности он может применяться самостоятельно для взаимодействия с любыми другими веб-приложениями.

Загрузить дистрибутив платформы Course Orchestra
Download.png
Новейшая версия

trunk

Download.png
Стабильная версия

stable

Постановка задачи

Предположим, что на разных доменах (к примеру, www.domain-1.ru и www.domain-2.ru) развёрнуты разные веб-приложения.

Тот факт, что эти приложения развёрнуты на разных доменах, означает, что наборы сохраняемых браузером куков каждого из приложений индивидуальны и полностью изолированы друг от друга. То есть запрос на показ веб-страницы для приложения не будет содержать никаких данных о том, что пользователь был и авторизовывался ранее в каких-либо других приложениях.

Задача состоит в том, чтобы организовать общую авторизацию между несколькими веб-приложениями, то есть построить систему, благодаря которой пользователь, выполнивший аутентификацию в любом веб-приложении, при входе во все другие приложения также оказывался бы аутентифицирован, а при потере аутентификации в любом из приложений также переставал бы быть аутентифицированным для всех остальных приложений. За реализацию этого механизма отвечает сервер аутентификации, который может находиться на домене, отличающемся от доменов любого из приложений (к примеру, находиться в домене www.authentication-domain.ru), к нему за информацией должны обращаться как пользователь из браузера, так и напрямую взаимодействующие приложения (см. схему далее по тексту).

Для работоспособности этой схемы пользовательские браузеры должны поддерживать т. н. «сторонние куки».

Применяемые термины

  • В этом руководстве используется слово «аутентификация», означающее проверку «свой-чужой». Это слово следует отличать от слова «авторизация», означающее проверку, какими правами наделён «свой». Мы говорим только о системе аутентификации. Описываемая здесь система ничего не знает о ролях и правах аутентифицированного пользователя и не занимается ими.
  • Провайдером аутентификации мы будем называть систему, которая по паре «логин/пароль» может выдать ответ «свой/чужой». Mellophone поддерживает работу со следующими типами провайдеров аутентификации:
  • Общая для всех приложений сессия аутентификации имеет «идентификатор сессии аутентификации», отличный от «идентификатора сессии приложения». У каждого веб-приложения имеется свой (известный только самому этому приложению и серверу аутентификации) идентификатор сессии приложения. Он хранится в куки, выставляемой на домен приложения. Идентификатор сессии аутентификации известен только самому серверу аутентификации и хранится в стороннем куки, выставленном на домен сервера аутентификации. Одному идентификатору сессии аутентификации может соответствовать какое угодно количество идентификаторов сессий приложений. Одному идентификатору сессии приложения может соответствовать ноль, означающий, что идентификатор сессии приложения не аутентифицирован, или единица, означающая, что идентификатор сессии приложения аутентифицирован и является идентификатором активной сессии аутентификации. Таблицу соответствия между идентификаторами сессий приложения и идентификаторами активных сессий аутентификации хранит сервер аутентификации.

В некоторых случаях (для обеспечения дополнительной информационной защиты) приложению может понадобиться сменить идентификатор сессии приложения. Для отражения этого факта в Mellophone имеется специальный сервлет /changeappsesid.

Компоненты решения задачи

Для решения задачи применяются следующие составляющие:

  • Сервер аутентификации (Mellophone), на котором экспонированы:
    • сервлеты, обслуживающие прямые запросы с серверов веб-приложений;
    • один сервлет, обслуживающий запросы от клиентских браузеров, поступающих в виде запросов на отображение фрейма или картинки на странице веб-приложения.
  • Протокол, по которому любое веб-приложение может взаимодействовать с сервером аутентификации для обеспечения общей аутентификации.

Сервлеты сервера аутентификации и протокол работы с ними

AuthServer.png

Сервлеты для прямых запросов с серверов веб-приложений

  • /login?sesid=...&login=...&pwd=...&gp=... – этот сервлет выполняет следующие функции:
    • аутентифицирует сессию;
    • в случае если пара «логин-пароль» верна, генерирует внутри себя идентификатор сессии аутентификации и аутентифицирует сессию приложения sesid и возвращает 200 OK;
    • в случае если пара «логин-пароль» неверна, возвращает 403.8 FORBIDDEN.
    • gp - группа провайдеров,
      • если параметр отсутствует, то попытка логина производится для всех провайдеров,
      • если параметр задан и равен "not_defined" или "", то попытка логина производится только для провайдеров с пустой или не заданной группой,
      • в остальных случаях задания параметра, попытка логина производится только для провайдеров с заданной группой,
    • ip - ip компьютера пользователя для передачи в ф-цию проверки пользователя по логину и ip (на текущий момент актуально только для SQL-провайдера аутентификации).

Важная информацияДля защиты от взлома методом перебора паролей (Brute Force) система блокирует логин, для которого пять раз подряд введён неверный пароль, на lockouttime минут. Параметр задается в файле настроек config.xml, значение по умолчанию равно 10.

  • /logout?sesid=... — разаутентифицирует сессию с идентификатором приложения sesid и все другие сессии приложений, соотносящиеся с той же сессией аутентификации.
  • /isauthenticated?sesid=... — возвращает:
    • 200 OK и информацию об аутентифицированном пользователе, если сессия с идентификатором сессии приложения sesid аутентифицирована;
    • 403.8 FORBIDDEN, если сессия с идентификатором sesid не аутентифицирована.
  • /changeappsesid?oldsesid=...&newsesid=... — данный сервлет предназначен для фиксации смены идентификатора сессии приложения. Сервлет возвращает:
    • 200 OK — если смена прошла успешно;
    • 403.8 FORBIDDEN, если сессия приложения с идентификатором oldsesid не была аутентифицирована.
  • /checkname?sesid=...&name=... — возвращает:
    • 200 OK и информацию об аутентифицированном пользователе, если пользователь с таким именем существует в директории;
    • 200 OK и пустое тело ответа, если пользователь с таким именем не существует;
    • 403.8 FORBIDDEN, если сессия с идентификатором sesid не аутентифицирована.
  • /importgroupsproviders — возвращает:
    • 200 OK и список групп провайдеров, если список получен успешно. При этом,
      • список состоит из неповторяющихся названий групп,
      • если группа провайдера отсутствует или равна "", то значением принимается "not_defined";
    • 403.8 FORBIDDEN, если получение списка закончилось неудачей.
  • /changepwd?sesid=...&oldpwd=...&newpwd=... – предназначен для изменения пароля аутентифицированного пользователя. Возвращает
    • 200 OK и имя аутентифицированного пользователя, если сессия с идентификатором сессии приложения sesid аутентифицированаи и старый пароль введён верно;
    • 403.8 FORBIDDEN, если сессия с идентификатором sesid не аутентифицирована и/или старый пароль введён неверно.
  • /checkcredentials?login=...&pwd=...&gp=...&ip=... – возвращает:
    • 200 OK и информацию о пользователе, если пара «логин-пароль» верна,
    • 403.8 FORBIDDEN, если пара «логин-пароль» неверна,
    • gp - группа провайдеров,
      • если параметр отсутствует, то попытка логина производится для всех провайдеров,
      • если параметр задан и равен "not_defined" или "", то попытка логина производится только для провайдеров с пустой или не заданной группой,
      • в остальных случаях задания параметра, попытка логина производится только для провайдеров с заданной группой,
    • ip - ip компьютера пользователя для передачи в ф-цию проверки пользователя по логину и ip (на текущий момент актуально только для SQL-провайдера аутентификации).
  • /getproviderlist?login=...&pwd=...&gp=...&ip=... – возвращает:
    • 200 OK и информацию о провайдерах с группой gp, если пара «логин-пароль» верна,
    • 403.8 FORBIDDEN, если пара «логин-пароль» неверна,
    • gp - группа провайдеров,
      • если параметр отсутствует, то попытка логина производится для всех провайдеров,
      • если параметр задан и равен "not_defined" или "", то попытка логина производится только для провайдеров с пустой или не заданной группой,
      • в остальных случаях задания параметра, попытка логина производится только для провайдеров с заданной группой,
    • ip - ip компьютера пользователя для передачи в ф-цию проверки пользователя по логину и ip (на текущий момент актуально только для SQL-провайдера аутентификации).
    • Возвращается следующая информация о провайдере
<?xml version="1.0" encoding="utf-8"?>
<providers>
	<provider id="test1" type="sqlserver" url="jdbc:sqlserver://host\\SQL8:1145;databaseName=showcase" group_providers="Группа1"/>
	<provider id="test2" type="xmlfile" url="D:/mellophone/users.xml" group_providers="Группа2"/>
</providers>

где

    • id - идентификатор провайдера аутентификации,
    • type - тип провайдера аутентификации,
    • url - строка соединения с провайдером,
    • group_providers - группа провайдера.
  • /getuserlist?token=...&gp=...&ip=...&pid=... – возвращает:
    • 200 OK и информацию о пользователях провайдера с идентификатором pid (или всех провайдеров с группой gp, если pid не задан), в случае успеха,
    • 403.8 FORBIDDEN, в случае неудачи.

Параметры

    • token - токен безопасности. Должен совпадать с параметром <getuserlisttoken> файла настроек config.xml. В противном случае, настройки изменены не будут,
    • gp - группа провайдеров,
    • ip - ip компьютера пользователя для передачи в ф-цию проверки пользователя по логину и ip (на текущий момент актуально только для SQL-провайдера аутентификации).
    • Информация о пользователях возвращается в следующем виде
<?xml version="1.0" encoding="utf-8"?>
<users pid="test">
	<user phone="123-56-78" name="Пользователь" login="user111" fax="fax4" email="12@yandex.ru" SID="8dbf2hndsdsseaa31"/>
	<user phone="784-23-f5" name="Петров А. М." login="Петров1" fax="fax2" email="34@yandex.ru" SID="f2fwe0fghfgfsdbe5/>
	<user phone="апе-43-67" name="Сидоров В. Л." login="Сидоров1" fax="fax3" email="56@yandex.ru" SID="5e599dffffdf041"/>
</users>
<users pid="test2">
	<user login="Иванов1" SID="8dbffjjdsjjahj2a31" name="Иванов1" email="12@yandex.ru" phone="123-56-78" organization="org1" fax="fax1"/>
	<user login="Петров" SID="f2dmjfdssf0dhhgjbe5" name="Петров" email="34@yandex.ru" phone="784-23-f5" organization="org2" fax="fax2"/>
</users>


  • /setsettings?token=...&lockouttime=...&loginattemptsallowed=... – предназначен для динамического изменения настроек mellophone.

Возвращает:

    • 200 OK в случае успешного изменения настроек,
    • 403.8 FORBIDDEN и информацию об ошибке, если настройки изменить не удалось.

Параметры

    • token - токен безопасности. Должен совпадать с параметром <setsettingstoken> файла настроек config.xml. В противном случае, настройки изменены не будут,
    • lockouttime - время в минутах, на которое будет блокироваться пользователь, в случае loginattemptsallowed неудачных попыток ввода пароля.

Настройка сохраняется в файле настроек config.xml. Для корректной работы необходимо наличие тега <lockouttime> в этом файле

 <lockouttime>10</lockouttime>
    • loginattemptsallowed - количество неудачных попыток ввода пароля до блокировки пользователя.

Настройка сохраняется в файле настроек config.xml. Для корректной работы необходимо наличие тега <loginattemptsallowed> в этом файле

 <loginattemptsallowed>5</loginattemptsallowed>


Сервлет для установки стороннего куки

  • /authentication.gif?sesid=... — принимает в качестве параметра запроса идентификатор сессии приложения sesid и ожидает в запросе, когда можно будет прочитать куки «authsesid». При этом:
    • если переданное в запросе куки authsesid содержит идентификатор активной сессии аутентификации, то этот сервлет возвращает «цветной баннер» и связывает sesid с активной сессией аутентификации (тем самым делая идентификатор сессии приложения sesid аутентифицированным).
    • если в запросе отсутствует куки authsesid или оно содержит идентификатор, не входящий в список активных сессий аутентификации, то этот сервлет:
      • возвращает «чёрно-белый баннер», если сессия приложения с идентификатором sesid не аутентифицирована, и в ответе стирает куки authsesid;
      • возвращает «цветной баннер», если сессия приложения с идентификатором sesid аутентифицирована, и в ответе устанавливает куки authsesid, содержащее идентификатор сессии аутентификации.

Протокол работы веб-приложения с сервером аутентификации

Предполагается, что каждый запрос к веб-приложению происходит в контексте идентификатора сессии приложения. Apache Tomcat, любой другой сервлет-конейнер, PHP и многие другие системы для серверного программирования предоставляют в готовом виде механизм генерации и отслеживания идентификатора сессии приложения. Этими идентификаторами уместно пользоваться при общении с сервером аутентификации.

Если мы имеем дело с системой, которая в готовом виде не поддерживает механизм сессий приложения, то реализовать его можно таким образом:

  • При каждом запросе страницы веб-приложения пытаться читать куки с идентификатором сессии приложения. Если оно найдено, то это означает, что мы находимся в соответствующем контексте.
  • Если соответствующее куки не найдено, то идентификатор сессии приложения следует сгенерировать с помощью криптостойкого генератора случайных чисел и сохранить в куки.

Описание протокола:

  1. При генерации страницы приложения по запросу пользователя сервером веб-приложения вызывается сервлет /isauthenticated?sesid=…. При положительном ответе страница приложения генерируется в зависимости от прав текущего пользователя. При отрицательном ответе формируется страница с полями для ввода логина и пароля (а куки sesid считается закрытой).
  2. В любом случае страница веб-приложения должна содержать тэг:
     <img src=”адрес.сервера.аутентификации/authentication.gif?sesid=...”/>
    
  3. Страница веб-приложения с полями для ввода логина-пароля также должна содержать javascript, срабатывающий после загрузки страницы и определяющий, какой баннер загрузился. И если загрузился «цветной баннер», страница с полями логина-пароля должна перезагрузить сама себя (ибо так оказалось, что логин-пароль не нужен — в сторонних куках был идентификатор активной сессии аутентификации). Как Javascript узнает, какой баннер загрузился? Это можно сделать, например, если картинки будут отличаться по размеру на 1 пиксел. Узнать размер картинки можно с помощью кода:
    var pic = document.getElementById(id); var h = pic.offsetHeight;  var w = pic.offsetWidth;
    
  4. Страница веб-приложения должна содержать кнопку разаутентификации, вызывающую ссылку: адрес.сервера.аутентификации/logout?sesid=...

Настройка Mellophone

Файл настройки config.xml находится в поддиректории config директории установки приложения. Файл содержит общие настройки приложения и перечисление настроек провайдеров аутентификации в субтэгах корневого тэга config. Пример файла config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.curs.ru/authserver config.xsd" xmlns="http://www.curs.ru/authserver">

        <!-- Общие настройки -->
	<common>
         	<threadcount>4</threadcount>
		<authsessions initialCapacity="16" loadFactor="75" concurrencyLevel="16"/>	
		<appsessions initialCapacity="16" loadFactor="75" concurrencyLevel="16"/>		
  	        <lockouttime>10</lockouttime>
                <loginattemptsallowed>5</loginattemptsallowed>
	        <setsettingstoken>43c42c2ee9210b0a77166a37f82bb4b6</setsettingstoken>	    
   	        <getuserlisttoken>9ed41e1e40ff47208d8e0943b918a554</getuserlisttoken>
                <showtimetounlockuser>true</showtimetounlockuser>
                <checkpasswordhashonly>true</checkpasswordhashonly>
	</common>		

        <!-- Провайдер LDAP ApacheDS-->
	<ldapserver>
    	        <id>test</id>
   	        <group_providers>Группа1</group_providers>
		<logging>true</logging>
		<servertype>ApacheDS</servertype>		
		<url>ldap://localhost:10389</url>
		<usessl>false</usessl>
		<sat>Simple</sat>
		<searchbase>ou=users,ou=system</searchbase>
		<searchreturningattributes
		  SID="entryUUID"
		  login="uid"
		  name="cn"
		  email="mail"
		  phone="homePhone"
		  organization = "o"
		  fax = "facsimileTelephoneNumber"	  
		/>		
		<searchfilterforuser>
		  (&amp;(objectClass=inetOrgPerson)(uid=%s))
  	        </searchfilterforuser>
		<searchfilterforimport>
		  (&amp;(objectClass=inetOrgPerson))
		</searchfilterforimport>
	</ldapserver>

        <!-- Провайдер LDAP ActiveDirectory--> 
	<ldapserver>
 	        <id>test2</id>
   	        <group_providers>Группа1</group_providers>
	        <domain_name>Office</domain_name> 
		<logging>true</logging>	
		<servertype>MSActiveDirectory</servertype>		
		<url>ldap://srv:389</url>
		<usessl>false</usessl>
		<sat>DIGEST_MD5</sat>
		<searchbase>CN=Builtin,DC=curs,DC=ru</searchbase>
		<searchbase>CN=Users,DC=curs,DC=ru</searchbase>
		<searchbase>OU=Office,DC=curs,DC=ru</searchbase>
		<searchreturningattributes
		  SID="objectSid"		
		  login="sAMAccountName" 
		  name="name"
		  email="targetAddress"
		  phone="telephoneNumber"	
		  organization = "" 
		  fax = ""	  
		/>		
		<searchfilterforuser>
		  (&amp;(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(sAMAccountName=%s))
  	    </searchfilterforuser>
		<searchfilterforimport>
		  (&amp;(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
		</searchfilterforimport>
	</ldapserver>

        <!-- Провайдер XML-файл-->
	<xmlfile>
 	        <id>test3</id>
   	        <group_providers></group_providers>
		<logging>true</logging>	
		<url>D:/workspace/mellophone/WebContent/config/users.xml</url>
	</xmlfile>

	<!-- Провайдер база данных-->
        <sqlserver>
	        <id>test4</id>
 		<logging>true</logging>
		<url>jdbc:sqlserver://BORIS2\\SQL8R2_RUS_TEST2:1145;databaseName=showcase</url>
		<connectionusername>sa</connectionusername>
		<connectionpassword>F708420Dx</connectionpassword>
		<table>Пользователи</table>
		<fieldlogin>Логин</fieldlogin>
		<fieldpassword>Пароль</fieldpassword>
		<fieldblocked>Заблокированный</fieldblocked>
		<hashalgorithm>SHA-256</hashalgorithm>
		<localsecuritysalt>0763bdd890421f02bba7bfe8b456c69f</localsecuritysalt>
		<proccheckuser>checkUserIP</proccheckuser>
		<searchreturningattributes
		  SID="Поле objectSid"		
		  login="Логин" 
		  name="Поле name"
		  email="Поле email"
		  phone="Поле phone"	
		  organization = "" 
		  fax = "Поле fax"	  
		/>
	</sqlserver>

        <!-- Провайдер HTTP-->
	<httpserver>
		<logging>true</logging>	
		<url>http://info.ondp2012.ru/security/</url>
		<validateuser>ValidateUser</validateuser>		
		<userinfobyname>User/%s</userinfobyname>
		<userinfobyid>User/Id/%s</userinfobyid>
	</httpserver>
</config>

В этом файле могут быть заданы настройки многих провайдеров аутентификации (успешно работают установки с десятками провайдеров аутентификации типа LDAP). Для увеличения скорости работы опрос провайдеров происходит в четыре параллельных потока выполнения. Пользователь считается аутентифицированным, если хотя бы один из провайдеров успешно аутентифицировал пользователя.

Подробное описание каждого из типов провайдеров аутентификации приводится далее.

Общие настройки

  • threadcount - количество потоков, параллельно опрашивающих логин-провайдеры (значение по умолчанию 4),
  • sessiontimeout(целое число) - время жизни сессии в минутах. Нуль или отсутствие значения говорит о бесконечном времени жизни сессии.
  • lockouttime - время в минутах, на которое будет заблокирован пользователь после loginattemptsallowed неудачных попыток ввода пароля (значение по умолчанию 10).
  • loginattemptsallowed - количество неудачных попыток ввода пароля до блокировки пользователя (значение по умолчанию 5).
  • setsettingstoken - токен безопасности для сервлета /setsettings (значение по умолчанию null).
  • getuserlisttoken - токен безопасности для сервлета /getuserlist (значение по умолчанию null).
  • showtimetounlockuser(логическое) - показывать ли время, оставшееся до разблокировки пользователя, заблокированного по причине большого количества неудачных попыток ввода пароля.
  • checkpasswordhashonly(логическое) - настройка типа проверки пароля при логине. Если true будет проверяться только хеш пароля, если false будут проверяться и хеш пароля, и сам пароль (значение по умолчанию false).
  • настройки списков аутентификации authsessions и сессий приложений appsessions
    • initialCapacity - начальная емкость списка (значение по умолчанию 16),
    • loadFactor - используется списком для определения, когда произойдет увеличение его размера по мере заполнения (значение по умолчанию 75%),
    • concurrencyLevel - определяет количество сегментов, которое будет содержать список. Количество сегментов будет выбрано как ближайшая степень двойки, большая чем concurrencyLevel. При этом, занижение concurrencyLevel ведёт к тому, что более вероятны блокировки потоками сегментов списка при записи, завышение показателя ведёт к неэффективному использованию памяти (значение по умолчанию 16).

Любые (или все) из этих настроек могут быть не заданы. В таком случае будут использоваться значения по умолчанию.

SQL-провайдер аутентификации

Принцип работы

Этот провайдер работает с таблицей в базе данных, в полях которой хранится логин пользователя, хэшированный по SHA-1 пароль, а также дополнительная информация о пользователе, такая, как его имя, email и прочее.

Для простоты первоначальной настройки пароль можно указывать и в явном виде, после смены пароля пользователем в соответствующем поле будет храниться хэшированный пароль.

Параметры настройки в файле config.xml

Провайдер определяется тэгом sqlserver.

Параметры (субтэги):

  • id (строка) - идентификатор провайдера.
  • logging (true/false) - выводить в лог события работы провайдера.
  • group_providers (строка) - группа, к которой относится данный провайдер. Используется для ограничения множества провайдеров, в которые происходит попытка логина. Может быть пустой или отсутствовать. Конкретная группа передается в качестве параметра в сервлете логина, пользователь может иметь возможность явно выбирать группу провайдеров при подключении.
  • url (строка) - JDBC URL подключения к серверу базы данных.
  • searchreturningattributes (тэг с атрибутами) - содержит в себе указания, какие поля в записи следует интерпретировать в качестве SID, логина, электронной почты и т.п. пользователя системы. Атрибуты тэга searchreturningattributes следующие:
    • SID - SID пользователя
    • login - логин пользователя
    • name - имя пользователя
    • email - электронная почта пользователя
    • phone - телефон пользователя
    • organization - организация пользователя
    • fax - факс пользователя
  • connectionusername (строка) - имя пользователя, от лица которого происходит подключение к базе данных.
  • connectionpassword (строка) - пароль пользователя, от лица которого происходит подключение к базе данных.
  • table (строка) - таблица, в которой находится перечень пользователей и их хэшированных паролей.
  • fieldlogin (строка) - поле таблицы, в котором находятся имена пользователей.
  • fieldpassword (строка) - поле таблицы, в котором находятся хэшированные пароли.
  • fieldblocked (bit) - поле таблицы, в котором находится признак того, что пользователь является заблокированным. Настройка является необязательной. Значение по умолчанию false.
  • hashalgorithm (строка) - алгоритм, используемый для хэширования пароля при создании нового пароля. Возможные значения:
    • MD2
    • MD5
    • SHA-1
    • SHA-224
    • SHA-256 (значение по умолчанию)
    • SHA-384
    • SHA-512
  • localsecuritysalt (строка) - "локальная" (в том смысле, что не хранится в базе данных) соль, используемая при расчете хеша пароля. Повышает устойчивость системы к взлому.

При этом, хеш пароля считается как HASH(password+salt+localsecuritysalt). Пароль хранится в базе в виде hashalgorithm#salt#hash

  • proccheckuser (строка) - ф-ция проверки пользователя по логину и ip.

HTTP-провайдер аутентификации

Принцип работы

Данный провайдер предполагает, что где-то реализован HTTP-сервис, содержащий в себе три сервлета:

  • валидации логина/пароля (по запросу POST данный сервис обязан принимать XML вида
<login name="User" password="pass" xmlns="http://www.curs.ru/ns/AuthServer">
  • получения информации о пользователе по его логину
  • получения информации о пользователе по его GUID

Параметры настройки в файле config.xml

Провайдер определяется тэгом httpserver.

Параметры (субтэги):

  • logging (true/false) - выводить в лог события работы провайдера.
  • group_providers (строка) - группа, к которой относится данный провайдер. Используется для ограничения множества провайдеров, в которые происходит попытка логина. Может быть пустой или отсутствовать. Конкретная группа передается в качестве параметра в сервлете логина, пользователь может иметь возможность явно выбирать группу провайдеров при подключении.
  • url (строка) - HTTP URL подключения к сервису HTTP.
  • validateuser (строка) - имя сервлета проверки пары "логин/пароль" пользователя.
  • userinfobyname (строка) - шаблон ссылки для доступа к информации о пользователе по его логину, где подстановкой %s обозначено место для вставки имени пользователя.
  • userinfobyid (строка) - шаблон ссылки для доступа к информации о пользователе по его GUID, где подстановкой %s обозначено место для вставки GUID пользователя.

XML-файл-провайдер аутентификации

Принцип работы

Это — наиболее простой провайдер. Он работает с файлом XML на диске. Формат этого файла предопределён (пример см. ниже), файле хранится логин пользователя, хэшированный по SHA-1 пароль, а также дополнительная информация о пользователе, такая, как его имя, email и прочее.

Для простоты первоначальной настройки пароль можно указывать и в явном виде, после смены пароля пользователем в соответствующем атрибуте будет храниться хэшированный пароль.

<?xml version="1.0" encoding="utf-8"?>
<users xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.curs.ru/authserver users.xsd" xmlns="http://www.curs.ru/authserver">
	<user login="Иванов" password="пасс1"
		SID="8dbf2a31-cfe6-4188-a2f0-0125481355cd" name="Алексей В. Васильев"
		email="12@yandex.ru" phone="123-56-78" organization = "org1" fax = "fax1"/>
	<user login="Петров" password="c8233fc18a5fd0f87284d9fa971049891315ed84"
		SID="f2f0dbe5-da83-4367-9827-01e7c179ea3a" name="Борис В. Смирнов"
		email="34@yandex.ru" phone="784-23-f5" organization = "org2" fax = "fax2"/>
	<user login="Сидоров" password="пасс3"
		SID="5e599041-6a69-466e-b22c-f3003be536d9" name="Евгений Балмасов"
		email="56@yandex.ru" phone="апе-43-67" organization = "org3" fax = "fax3"/> 
        <user login="user111" password="pwd111"
                SID="8dbf2a31-cfe6-4188-a2f0-0125481355ce" name="Алексей В. Васильев"
                email="12@yandex.ru" phone="123-56-78" organization = "org4" fax = "fax4"/>
</users>

Параметры настройки в файле config.xml

Провайдер определяется тэгом xmlfile.

Параметры (субтэги):

  • id (строка) - идентификатор провайдера.
  • logging (true/false) - выводить в лог события работы провайдера.
  • group_providers (строка) - группа, к которой относится данный провайдер. Используется для ограничения множества провайдеров, в которые происходит попытка логина. Может быть пустой или отсутствовать. Конкретная группа передается в качестве параметра в сервлете логина, пользователь может иметь возможность явно выбирать группу провайдеров при подключении.
  • url (строка) - полный путь к XML-файлу, содержащему данные о пользователях.

LDAP-провайдер аутентификации

Принцип работы

Аутентификация по LDAP — наиболее предпочтительный для крупной организации вариант аутентификации, с её помощью можно добиться интеграции с ActiveDirectory и возможности входа пользователя под тем логином и паролем, под которым он входит в домен. Другой вариант — использование LDAP-сервера ApacheDS для хранения информации о пользователях.

Чтобы организовать аутентификацию по LDAP с ActiveDirectory, необходимо указать целый ряд параметров — адрес домен-контроллера, тип соединения, "ветки" директории, в которых будет осуществляться поиск пользователей.

Для предварительной проверки того факта, что эти опции верны, рекомендуется использовать инструмент Apache Directory Studio.

Пример задаваемого текстом списка пользователей для сервера ApacheDS:

version: 1

dn: ou=users,ou=system
objectClass: organizationalUnit
objectClass: top
ou: users

dn:: dWlkPdCh0LjQtNC+0YDQvtCyQXBhY2hlLG91PXVzZXJzLG91PXN5c3RlbQ==
objectClass: organizationalPerson
objectClass: person
objectClass: inetOrgPerson
objectClass: top
cn:: 0JDQu9C10LrRgdC10Lkg0JIuINCS0LDRgdC40LvRjNC10LI=
sn:: 0JLQsNGB0LjQu9GM0LXQsg==
facsimileTelephoneNumber: 2-987-65-43
homePhone: 2-123-45-67
mail: mail2
o:: 0L7RgNCz0LDQvdC40LfQsNGG0LjRjzI=
uid:: 0KHQuNC00L7RgNC+0LJBcGFjaGU=
userPassword:: e1NIQX16Z2p4aFl6ZWM1THNlSDVKZmdjdzBiQ0VIcnc9

dn:: dWlkPdCf0LXRgtGA0L7QskFwYWNoZSxvdT11c2VycyxvdT1zeXN0ZW0=
objectClass: organizationalPerson
objectClass: person
objectClass: inetOrgPerson
objectClass: top
cn:: 0JHQvtGA0LjRgSDQki4g0KHQvNC40YDQvdC+0LI=
sn:: 0KHQvNC40YDQvdC+0LI=
facsimileTelephoneNumber: 1-987-65-43
homePhone: 1-123-45-67
mail: mail1
o:: 0L7RgNCz0LDQvdC40LfQsNGG0LjRjzE=
uid:: 0J/QtdGC0YDQvtCyQXBhY2hl
userPassword:: e1NIQX15Q00vd1lwZjBQaHloTm42bHhCSmlSTVY3WVE9

Параметры настройки в файле config.xml

Провайдер определяется тэгом ldapserver.

Параметры (субтэги):

  • id (строка) - идентификатор провайдера.
  • logging (true/false) - выводить в лог события работы провайдера.
  • group_providers (строка) - группа, к которой относится данный провайдер. Используется для ограничения множества провайдеров, в которые происходит попытка логина. Может быть пустой или отсутствовать. Конкретная группа передается в качестве параметра в сервлете логина, пользователь может иметь возможность явно выбирать группу провайдеров при подключении.
  • servertype(MSActiveDirectory/ApacheDS) - тип LDAP-сервера: Microsoft ActiveDirectory или ApacheDS.
  • url (строка) - адрес LDAP-сервера, начиная с "ldap://" и заканчивая, после двоеточия, портом.
  • usessl (true/false) - использовать ли SSL при подключении к LDAP-серверу (пока не реализовано, нужно выставлять false).
  • sat (None/Simple/DIGEST_MD5/GSSAPI) - тип аутентификации, одно из следующих значений:
    • None - проверка имени пользователя и пароля не производится (может быть полезна, если сервер допускает анонимные соединения).
    • Simple - пароль передается в незашифрованном виде.
    • DIGEST_MD5 - пароль передается в зашифрованном виде, используя алгортим DIGEST_MD5. Замечания по поводу аутентификации при помощи DIGEST_MD5: 1.В случае AD Windows необходимо, чтобы имя пользователя было sAMAccountName 2.Критические системные объекты (например, 'Administrator') использовать нельзя 3. В случае AD Windows 2000 необходимо, чтобы на сервере было установлено "reversible password encryption enabled".
    • GSSAPI - аутентификация при помощи Kerberos.
  • domain_name (строка) - имя домена, связанное с данным LDAP-сервером. Опциональный параметр. В случае, если он указан, попытка логина в такой провайдер осуществляется два раза, один раз в формате "login", второй - в формате "domain_name\login".
  • searchreturningattributes (тэг с атрибутами) - содержит в себе указания, какие атрибуты LDAP-объекта следует интерпретировать в качестве SID, логина, электронной почты и т.п. пользователя системы. Атрибуты тэга searchreturningattributes следующие:
    • SID - SID пользователя
    • login - логин пользователя
    • name - имя пользователя
    • email - электронная почта пользователя
    • phone - телефон пользователя
    • organization - организация пользователя
    • fax - факс пользователя
  • searchbase (строка, может быть несколько) - база поиска пользователя в LDAP-дереве. Можно задать несколько баз, используя несколько тэгов searchbase.
  • searchfilterforuser - LDAP-запрос для поиска пользователя по имени, где подстановкой %s обозначено место для вставки имени пользователя.
  • searchfilterforimport - LDAP-запрос для поиска всех пользователей (для сервлета /getuserlist).