tableau Server实现单点登录

开发一个单点登录服务,有一个导航系统,点击导航系统上的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");

你可能感兴趣的:(sso,tableau,单点登录服务)