Оформление
Ajax кросс-доменная асинхронная единая регистрация
1. Обзор
1.1 Описание проблемы
Система OA интегрирована с системой BI, и BI привязан к узлу системы OA. Если вы хотите реализовать единый вход в FineBI в системе OA, вам нужно передать имя пользователя и пароль на адрес аутентификации BI для аутентификации в интерфейсе входа в OA.
Если OA-система и BI-система не развернуты на одном сервере, а при входе в систему происходит кросс-домен, то как добиться кросс-доменного входа в OA-систему и BI-систему с помощью Ajax?
1.2 Идеи для решений
Оба метода входа iframe и Ajax могут реализовать междоменный единый вход, но Ajax может реализовать асинхронный единый вход и обрабатывать результаты аутентификации BI-системы, такие как таймаут входа; однако iframe не может обрабатывать асинхронную обработку и не может обрабатывать результаты аутентификации, когда аутентификация выполнена.
Метод входа Ajax естественным образом поддерживает кросс-доменность, поэтому в интерфейсе входа в систему OA имя пользователя и пароль напрямую отправляются на сервер BI через Ajax для аутентификации на внутреннем уровне, что решает проблему кросс-доменного единого входа.
2. Примеры
Запустите два проекта с номерами портов 37799 и 8080 соответственно и поместите новые HTML-файлы ajaxlogin.md и ajaxlogout.md в проект с номером порта 37799. Зайдите на сайт http://localhost:37799/webroot/ajaxlogin.md, введите имя пользователя и пароль проекта 8080 и получите успешный доступ к проекту 8080.
Откройте новую вкладку в успешно вошедшем в систему браузере, посетите сайт http://localhost:37799/webroot/ajaxlogout.md, нажмите кнопку "Выход", чтобы обновить страницу проекта 8080, на которой ранее был успешно выполнен вход, и пользователя выкинет из системы.
Примечание: Примеры, приведенные в этой главе, относятся к ПК.
2.1 Подготовка окружающей среды
1) Для примера в этой статье подготовлены два проекта:
Примечание: Оба проекта должны иметь одинаковые имя пользователя и пароль.
- Локальный проект, номер порта 37799
- Проект, развернутый в Tomcat на порту 8080.
Развертывание сервера Tomcat см. в разделе: Развертывание сервера Tomcat
2) Запустите два проекта.
2.2 Новая страница входа в систему
Примечание 1: Измените путь доступа или номер порта в коде в соответствии с реальной ситуацией.
Примечание 2: В среде интрасети файл jquery.min.js, указанный в следующем коде, не работает, вам нужно загрузить JS-файл локально и изменить соответствующий путь, пожалуйста, обратитесь к следующим шагам: Часто задаваемые вопросы по единому входу.
2.2.1 Отсутствие специальных символов в имени пользователя или пароле
Создайте новый HTML-файл с именем "ajaxlogin.md" со следующим кодом:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type"
content="text/html; " charset="UTF-8"> <script type="text/
javascript" src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>  
;<script type="text/javascript"> function doSubmit() 
;{ var username = document.getElementById(&&
quot;username").value.trim(); var password =
document.getElementById("password").value.trim();  
; if (username === "") {  
; window.alert("Пожалуйста, введите имя пользователя");
return false; } &
nbsp; if (password === "") {   ; window.alert("Please enter username"); return false; }
nbsp; window.alert("Пожалуйста, введите пароль"); &
nbsp; return false;  
; } var url =& nbsp; "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=" + имя пользователя + "&fine_password=" + password + "&validity=" + -1;
alert(url); jQuery.ajax({ &
nbsp; url: url,// Единый вход для платформы администрирования Reporting Server  
; таймаут: 5000,//таймаут в миллисекундах  
nbsp; dataType: "jsonp",//кросс-доменное использование jsonp &
nbsp; jsonp: "callback", &
nbsp; success: function (res) { &
nbsp; console.log(res);
if (res.errorCode) { & nbsp; success: function (res) { & nbsp; console.log(res); nbsp;  
; window.alert(res.errorMsg);
}else { &
nbsp; // Сохраняем токен и переходим по соответствующей ссылке window.location.href = & & &
quot;http://localhost:8080/webroot/decision"; &
nbsp; } &
nbsp; }, error: function&
nbsp;() { &
nbsp;alert("Таймаут или другая ошибка сервера");// Вход не удался (таймаут или другая ошибка сервера)  
; } });  
; } </script> </head> <body> <p>Пожалуйста, войдите</p> <form&
nbsp;id="login" name="login" method="POST" action=""> &
nbsp;<p>Имя пользователя:<input id="username" type="text" name="username"/></p> & nbsp; <p>Пароль:<input id="password" type="password" name=""
пароль"/></p> <input type="button" value="Login" onClick
="doSubmit()"/> </form> </body> </html2.2.2 Специальные символы в имени пользователя или пароле
Если в имени пользователя или пароле присутствуют специальные символы, например "&#", необходимо перекодировать имя пользователя или пароль. В этом разделе описаны два способа перекодировки имени пользователя или пароля:
1) Вариант 1: Используйте функцию encodeURIComponent() для транскодирования
var url = "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=&
quot; +encodeURIComponent(username) + "&fine_password=" + encodeURIComponent(password)  ;+ "&validity=" + -1;Пример HTML-кода: programme1.md
2) Вариант 2: Использование данных для передачи параметров
data:{"fine_username":имя пользователя, "fine_password":пароль, validity:-1},Пример HTML-кода: programme2.md
2.3 Страница выхода пользователя из системы
Создайте новый HTML-файл с именем "ajaxlogout.md" со следующим кодом:
Примечание: Измените путь доступа или номер порта в коде в соответствии с реальной ситуацией.
<html> <head> <meta&
nbsp;http-equiv="Content-Type" content="text/html; " charset="UTF-8"> & lt;script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></
script> <script type="text/javascript">&
nbsp; function doSubmit() { jQuery.ajax({ &
nbsp;url: "http://localhost:8080/webroot/decision/logout/cross/domain",// сервер отчетов с единой регистрацией &
nbsp;dataType: "jsonp",//кросс-домен использует jsonp jsonp: "callback", &
nbsp; timeout:5000,//время таймаута (в миллисекундах) success:function(data) {&
nbsp; if (data.status === "
success") { &
nbsp; //Успешный выход из системы alert("Logged out"); }  
; }, error:function(){ &
nbsp; // Выход не удался (таймаут или другая ошибка сервера) } }); &
nbsp;} </script> </head> <
body> <p>Пожалуйста, выйдите из системы</p> < form id="login" name="login" method="POST" action="" >&
nbsp; <input type="button&
quot; value="logout" onClick="doSubmit()" /> &
nbsp;</form> </body> </html>2.4 Размещение HTML-файла в определенном месте
Поместите сохраненные файлы ajaxlogin.md и ajaxlogout.md в папку %BI_HOME%/webapps/webroot проекта с номером порта 37799, как показано на следующем рисунке:

2.5 Отключение кнопок, связанных с защитой
1) Войдите в платформу с номером порта 37799 от имени администратора, нажмите "System Management > Управление безопасностью" и отключите "Защиту от атак с подслушиванием содержимого" и "Защиту от атак Clickjacking", как показано на следующем рисунке:

2) Аналогично закройте "Content Sniffing Attack Protection" и "Clickjacking Attack Protection" для проекта с номером порта 8080.
2.6 Эффекты просмотра
1) Откройте браузер и посетите сайт: http: //localhost:37799/webroot/ajaxlogin.md, введите учетную запись и пароль для проекта с номером порта 8080 и успешно получите доступ к проекту 8080. Как показано на рисунке ниже:

2) Откройте новую вкладку браузера с успешным входом, посетите сайт http://localhost:37799/webroot/ajaxlogout.md, нажмите кнопку "Выход", переключитесь на страницу проекта 8080 с успешным входом, обновите страницу, и пользователя выкинет из логина. Как показано на рисунке ниже:

Примечание: Если в обоих проектах на портах 37799 и 8080 включена SMS-аутентификация, то ajax-однократная регистрация на сайте http://localhost:37799/webroot/ajaxlogin.md时 пропустит SMS-аутентификацию и успешно войдет в систему.