开发一个单点登录服务,有一个导航系统,点击导航系统上的tableau图标,进入单点登录服务,验证token,获取用户名密码,然后访问到tableauServer。tableauServer版本为18.3
实现前提:
1.在tableauServer管理端8850端口处,对单点服务所在的服务器进行ip授信
2.在tableauServer安装目录输入以下两条命令,使tableau支持单点登录(需要重启服务)
在tableau服务所在服务器的packages/scripts+版本(本人安装目录是C:\Program Files\Tableau\Tableau Server\packages\scripts.20194.18.1019.1426)目录下,输入一下两行命令:
tsm configuration set -k wgserver.unrestricted_ticket -v true
tsm pending-changes apply
实现方式:(前三步是自己系统的东西或者调用别的服务,和tableau无关,最重要的是获取到登录的用户名)
3.获取用户名,该用户名需要是tableau中存在的用户。
拿到用户名之后,调用tableau的API,传入用户名,tableau服务器ip,本机ip,站点(如果是默认站点,可以不传,如果不传,而且好几个站点中都有该用户,tableau登录页面会让用户选择进入哪个站点),获取tableau票据
/**
* 获取 Tableau Server 票证
* @param wgserver Tableau Server 的访问地址
* @param username Tableau Server 的用户名
* @param clientIp 客户端IP
* @param target_site 报表所在站点,如果不在默认站点上,则为必需
* @return 票证
*/
public static String getTrustedTicket(String wgserver, String username, String clientIp, String target_site) {
OutputStream output = null;
BufferedReader input = null;
try {
LOGGER.info("========>tableauip:" + wgserver);
System.out.println("========>tableauip:" + wgserver);
System.out.println("========>tableauUserName:" + username);
System.out.println("========>clientIp:" + clientIp);
URLConnection conn = new URL("http://" + wgserver + "/trusted").openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
output = conn.getOutputStream();
String urlParams = "username=" + EncodeUtil.urlEncode(username) + "&client_ip=" + EncodeUtil.urlEncode("127.0.0.1");
if(StringUtil.isNotEmpty(target_site) && !"Default".equals(target_site)){
urlParams += "&target_site=" + EncodeUtil.urlEncode(target_site);
}
output.write(urlParams.getBytes());
output.flush();
input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder writer = new StringBuilder();
for (String line = null; (line = input.readLine()) != null;) {
if (writer.length() > MAX_TRUSTED_LIMIT) {
throw new Exception("Input too lang!");
}
writer.append(line);
}
System.out.println("========>ticket:" + writer.toString());
return writer.toString();
} catch (Exception e) {
LOGGER.warn("!", e);
return "";
} finally {
IOUtils.closeQuietly(input);
IOUtils.closeQuietly(output);
}
}
返回的票据ticket如果不是空,且不是-1,可以认为获取票据成功。
然后response.sendRedirect("http://“+”tableauServer的ip"+"/trusted/"+ticket票据+"/#/site");
拼接url进入tableau的不同站点,拼接url方式不同
//指定站点 // response.sendRedirect(TABLEAU_SERVER_ADDR + "/trusted/" + ticket + "/#/site/指定的站点名称或站点URL"); //默认站点Default站点 //response.sendRedirect("http://"+wgserver+ "/trusted/" + ticket + "/#/"); //自选站点,进入登录之后,自己选择进入哪个站点下 //response.sendRedirect(TABLEAU_SERVER_ADDR + "/trusted/" + ticket + "/#/site");