Оформление
Настройка FineBI в качестве клиента CAS - Справка FineReport | Разработка отчетов | Отчеты | Учебные пособия
Настройка FineBI в качестве клиента CAS
1. Обзор
В этой статье описывается, как настроить FineBI в качестве клиента CAS.
1.1 Экологические инспекции
Перед настройкой FineBI необходимо настроить среду следующим образом:
(1) Настройка сервера CAS, если у пользователя уже есть среда CAS, эту операцию можно проигнорировать.
2) Настройте SSL-сертификат для доступа по протоколу HTTPS.
3) Реализовать аутентификацию на основе базы данных, которую можно игнорировать, если пользователю не нужно использовать информацию в базе данных для аутентификации при входе в систему.
1.2 Принципы работы
В процессе однократной регистрации в CAS, FineBI настраивается в соответствии с основными функциями, выполняемыми клиентом.
1) Когда пользователь обращается к системе FineBI, запрос перенаправляется на сервер CAS.
2) Проверить подлинность билета на сервере CAS, узнать, истек ли срок его действия и другую информацию.
(3) Получите имя пользователя, полученное в результате аутентификации CAS, и сравните его с именем пользователя в FineBI. Если сравнение совпадает и пользователь доступен, единый вход будет успешным.
Процесс аутентификации при входе в систему показан на следующем рисунке:

2. Операционные шаги
2.1 Копирование проекта BI
Скопируйте файл webroot в каталоге %FineBI%/webapps в %Tomcat_HOME%/webapps.
Примечание: Имя BI-проекта webroot можно настроить, но следует учитывать, что доступ к BI-проекту в дальнейшем будет осуществляться по адресу http://ip:端口/工程名/decision中的工程名也要随之更改.

2.2 Скопируйте пакет JAR
Скопируйте JAR-пакеты CAS casclient.jar и cas-client-core-3.2.1.jar, а также %Java_HOME%/jdk/lib/tools.jar в %TOMCAT_HOME%/webapps/webroot/WEB-INF/lib. INF/lib, как показано ниже:

2.3 Добавление файла web.xml
Файл web.xml используется для реализации следующих функций:
- Когда пользователь обращается к системе FineBI, запрос перенаправляется на сервер CAS.
- Проверьте подлинность билета на сервере CAS, независимо от того, истек срок его действия или нет.
Создайте новый файл web.xml в каталоге %TOMCAT_HOME%webapps/webroot/WEB-INF и вставьте в него код, как показано ниже:
<?xml version="1.0" encoding="UTF-8"?
> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <
display-name>Template WebApp</display-name> <mime-mapping> <extension>
msi</extension> <mime-type>application/x-msi</mime-type> </mime-mapping> <mime-mapping>.
<Фильтр> <имя фильтра>
CASFilter</filter-name> <filter-class>edu.yale.its.tp.cas.
client.filter.CASFilter</filter-class> <init-param> &
nbsp; <param-name>edu.yale.its.tp.cas.client.filter.
loginUrl</param-name> <param-value>
https://roxy:8443/cas/login</param-value>   ;<!
--cas предоставляет url страницы входа в систему --> </init-param>
<init-param> &
nbsp; <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> &
nbsp; <param-value>https://roxy:8443/cas/proxyValidate</param-value> & nbsp; <!
--cas предоставляет url для сервиса проверки тикеров или прокси-билетов --> </init-
param> <init-param> & nbsp; <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> &
nbsp; <param-value>roxy:8443</param-value> .
; & nbsp; <!
-домен и порт клиентского приложения--> </init-param> &
nbsp;</filter> <filter-mapping> &
nbsp; <filter-name>CASFilter</filter-name> <url-
pattern>/decision/*</url-pattern> </filter-mapping> <filter>&
nbsp; <filter-name>FrFilter</filter-name>
<filter-class>com.fr.FrFilter</filter-class> </filter>  
; <filter-mapping> <filter-name>FrFilter</filter-name>
<url-pattern>/decision/*</url-pattern> </filter-mapping&
gt; </web-app>roxy - это доменное имя вашей персональной конфигурации, пожалуйста, измените его в соответствии с вашими личными настройками, как показано на следующем рисунке:

2.4 Создание нового файла Java
Fr.Filter используется для получения имени пользователя, возвращаемого при аутентификации в CAS, и сравнения его с именем пользователя в FineBI, чтобы определить, является ли он пользователем системы FineBI.
1) Создайте новый Java-файл с именем FrFilter.java. Полный код Java показан ниже:
Код Java смотрите по ссылке: FrFilter.java
package com.fr; import com.fr.data.NetworkHelper; import com.fr.decision.mobile.terminal.TerminalHandler; import
com.fr.decision.webservice.utils.DecisionServiceConstants; import com.fr.decision.webservice.v10.login.LoginService; import&
nbsp;com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.security.JwtUtils; import com.
fr.stable.StringUtils; import com.fr.stable.web.Device; import org.jasig.cas.client.validation.Assertion; import javax
.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.
ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http
.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java
.io.IOException; /** * Created by Zed on 2018/9/11. */ public class FrFilter
implements Filter { public FrFilter() { }  
;@Override public void init(FilterConfig filterConfig) throws ServletException&
nbsp;{ } @Override public void doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws 
;IOException, ServletException { FineLoggerFactory.getLogger().info("
;fr cas login"); HttpServletRequest req = (
HttpServletRequest) servletRequest; HttpServletResponse res = (
HttpServletResponse) servletResponse; HttpSession session = req
.getSession(true); FineLoggerFactory.getLogger().info("URL:" +
req.getRequestURI()); String username; &
nbsp; //получаем имя пользователя, переданное cas Object object = req.getSession().
getAttribute("_const_cas_assertion_"); if (object !
= null) { Assertion assertion = (
Assertion) object; имя пользователя = assertion.
getPrincipal().getName(); } else { & nbsp; имя пользователя = (String) session.getAttribute("edu.yale.its.tp.cas.client.filter
.user"); } try { &
nbsp; //Имя пользователя пустое, есть проблема с запросом на вход, прямо сообщаем об ошибке &
nbsp; if (StringUtils.isNotEmpty(username)) { &
nbsp; FineLoggerFactory.getLogger().info("username:" + username); &
nbsp; // Получаем токен, переданный запросом & nbsp; Object oldToken = session.getAttribute
(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME); &
nbsp; //токен не существует, или срок действия токена истек, перейдите к фоновому методу входа в систему if (oldToken == null || !checkTokenValid(req, (String) oldToken, username))&
nbsp;{
login(req, res, session, username); &
nbsp; filterChain.doFilter(req, res);  
; } else { &
nbsp; // освобождение filterChain.doFilter(req, res);  
nbsp; filterChain.doFilter(req, res);   ; FineLoggerFactory.getLogger().info("не нужно&
quot;); } &
nbsp; } else {  
; throw new Exception("имя пользователя пустое"); }
nbsp; } } catch (Exception
e) { FineLoggerFactory.getLogger().error(e.getMessage(
), e); } } /**
* Фоновый метод входа */ private void login(HttpServletRequest& nbsp;req, HttpServletResponse res, HttpSession session, String username) throws Exception&
nbsp;{ String token = LoginService.getInstance().login(req, res
, username); req.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,&
nbsp;token); FineLoggerFactory.getLogger().info("fr FrFilter is 
;с именем пользователя ###" + имя пользователя); } /** &
nbsp; * Проверяем, действителен ли токен */ private boolean
checkTokenValid(HttpServletRequest req, String token, String currentUserName) { &
nbsp; try { // Текущий зарегистрированный пользователь и токен, соответствующий
имя пользователя отличаются, необходимо перегенерировать токен if (!ComparatorUtils.equals(
currentUserName, JwtUtils.parseJWT(token).getSubject())) { & nbsp; FineLoggerFactory.getLogger().info("имя пользователя изменено:" +
currentUserName); return false
; } &
nbsp; Device device = NetworkHelper.getDevice(req);  
; LoginService.getInstance().loginStatusValid(token, TerminalHandler.getTerminal(req, device)); return true; }
nbsp; return true;
} catch (Exception ignore) { } &
nbsp; return false; } @Override public
void destroy() { } }2) Скомпилируйте FrFilter.java и поместите полученный файл FrFilter.class в каталог %TOMCAT_HOME%\webroot\WEB-INF\classes\com\fr, как показано ниже:
Нажмите кнопку скачать и распакуйте, чтобы получить файл FrFilter.class: FrFilter.zip

3. просмотр результатов
Запустите сервер Tomcat, введите: https: //localhost:8443/webroot/decision即进入了 CAS экран входа в браузер, введите имя пользователя и пароль, чтобы перейти к соответствующему пользовательскому интерфейсу под системой принятия решений данных, как показано ниже:
