tableau SSO--Trusted Authentication实操

tableau在发布的时候,默认是需要登录的,但是在实际场景中,大多数的tableau的用户展示是和各自公司的自有系统整合在一起的,在这个时候,单点登录(SSO)是常用的措施之一,tableau也支持sso的相关配置。
1)SAML
2)Kerberos
3)OPENID
4)受信任的身份验证

这里主要介绍受信任的身份认证下的操作,其余部分可自行查看tableau help.

1.测试Trusted Authentication环境

1.1 server端设置
在server安装目录的bin下执行:
注意这里需要填写的是web server的地址,如果有多个用逗号分隔

tabadmin.bat set wgserver.trusted_hosts "10.146.246.133"
   tabadmin.bat config
   tabadmin.bat restart

需要注意的地方:
(1)增加ip地址的时候需要用逗号分隔,而且都还后面有一个英文的空格,否则会报错
(2)用命令行增加的ip不能太多,否则在windows下会报错,但是后面会提供解决办法

1.2 在web server上创建测试的网页,如test.html

<html>
<head>
<title>Trusted Ticket Requestertitle>
<script type="text/javascript">
function submitForm(){document.getElementById('form1').action = document.getElementById('server').value + "/trusted";}
script>
<style type="text/css">
.style1 {width: 100%;}
.style2 {width: 429px;}
#server { width: 254px; }
style>
head>

<body>
<H3>Trusted TicketerH3>
<form method="POST" id="form1" onSubmit="submitForm()">
<table class="style1">
<tr>
<td class="style2">
Username:td>
<td>
<input type="text" name="username" value="" />td>
tr>
<tr>
<td class="style2">
Server: td>
<td>
<input type="text" id="server" name="server" value="http://" />td>
tr>
<tr>
<td class="style2">
Client IP (optional):td>
<td>
<input type="text" id="client_ip" name="client_ip" value="" />td>
tr>
<tr>
<td class="style2">
Site: (leave blank for Default site, else NameOfSite if using sites)td>
<td>
<input type="text" id="target_site" name="target_site" value="" />td>
tr>
<tr>
<td class="style2">
<input type="submit" name="submittable" value="Go" />td>
<td>
td>
tr>
table>
form>
<H4>Be sure to add your IP as a Trusted IP address to the serverH4>
body>
html>

效果如图:

这里需要填写server:就是tableau server的地址; username是server上开设的用户;clientip是本地ip
点击“Go”后会得到一个12位的字符串,我们称之为ticket

1.3测试联通性

http:///trusted//views/BusinessDashboard/AreaSalesPerformance

views后面是实际制作发布的工作簿的地址

2.问题说明及改进

2.1 无法获取ticket
很多时候出错是因为无法获取到ticket,或者返回-1,出现此问题的解决办法如下:
在server安装目录下会显示具体的出错信息。

ProgramData\Tableau\Tableau Server\data\tabsvc\logs\wgserver\production*.log
ProgramData\Tableau\Tableau Server\data\tabsvc\logs\vizqlserver\vizql*.log

需要确认以下信息
1)所有web server的hostname或者ip地址加入到trusted hosts
2) wgserver.trusted_hosts的格式必须是逗号分隔并且中间有引文空格
3)ip地址为ipv4
4)用户名为server端的交互者或者浏览者身份
5)如果是asp.net或者c#,需要在http request定义content type:

 http.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")

2.2 ip地址过多使用命令出错
编辑 ProgramData\Tableau Server\config\tabscv.yml
注意wgserver.trusted_hosts行的编辑不能换行,规则同上,即逗号分隔+英文空格
编辑后需要在命令行执行tabadmin restart重启服务

2.3 实际使用
上面只是测试,在实际中ticket不是固定值,每次请求都会分配一个动态随机值,所以需要在程序中动态获取
server端返回的ticket值,tableau在安装目录下有现成的例子,以php为例,目录在
Tableau Server\9.3\extras\embedding\php
可以详细参考,但是例子中使用了pecl_http组件,这个组件默认php没有安装需要自行安装,其实根本不用这么麻烦,使用下面的例子即可:test.php


$server = "192.168.209.85";
$user="view";
$url="views/DEMO-CC16SP-20160518/sheet0";

Function get_trusted_ticket($wgserver, $user, $remote_addr) {
  $params = array(
    'username' => $user,
    'client_ip' => $remote_addr
  );

  return do_post_request("http://$wgserver/trusted", $params);
}

function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => http_build_query($data)
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}


function url($server,$ticket,$view_url){
  $params = ':embed=yes&:toolbar=yes';
  return "http://$server/trusted/$ticket/$view_url?$params";

}

$getticket = get_trusted_ticket($server,$user,$_SERVER['REMOTE_ADDR']);
$geturl = url($server,$getticket,$url);

?>

<iframe src=""
        width="1024" height="768" border='0'>
iframe> 




<html>

<head>
    <title>Basic Embedtitle>

    <script type="text/javascript" 
            src="http://192.168.209.85/javascripts/api/tableau-2.js">script>
    <script type="text/javascript">
        function initViz() {
            var containerDiv = document.getElementById("vizContainer"),
                url = "",
                options = {
                    hideTabs: true,
                    onFirstInteractive: function () {
                        console.log("Run this code when the viz has finished loading.");
                    }
                };

            var viz = new tableau.Viz(containerDiv, url, options); 
            // Create a viz object and embed it in the container div.
        }
    script>
head>

<body onload="initViz();">
    <div id="vizContainer" style="width:800px; height:700px;">div>    
body>

html>

后续测试发现:
ie firefox chrome均正确,
win10的默认浏览器有点问题,估计和html头有关系,后面再调整。

你可能感兴趣的:(tableau)