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头有关系,后面再调整。