logo

11 сент. 2009 г.

BIP: программный logout при доступе через URL

Что если вы используете BI Publisher в качестве инструмента отчетности в вашей информационной системе. И по каким-то причинам не используете стандартную поддержку SSO, а осуществляете разграничение полномочий в BIP c помощью передаваемых параметров URL'а с логином-паролем пользователя.
Может так случиться, что при наличии открытых окон браузера повторно переданные логин-пароль (уже отличные от предыдущих) не сработают.
Пример: вы зашли из внешней ИС в определенную папку с отчетами веб-интерфейса BIP под пользователем "user1", затем закрыли браузер, сделали logout из вашей исходной системы, НО где-то у вас "крутится" еще один браузер (картинки из "ВКонтакте" вы там смотрели...). И теперь при попытке зайти из вашей ИС под другим пользователем ("user2") вы получите сессию предыдущего пользователя.
Как этого избежать?


Так получается потому что еще жива недавно созданная сессия BIP, а раз браузер не закрывался, то и сессия не прекращалась.

Во-первых, крайне рекомендую использовать стандартную возможность SSO.
Но если это невозможно, то вот небольшой пример, иллюстрирующий как можно с помощью javascript сделать logout в BI Publisher'е перед входом в него под новым пользователем.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1">
<title>Untitled Document</title>

<script type = "text/javascript">
var sBIPHost = 'LOCALHOST';
var sLogin = 'USERID';
var sPasswd = 'USERPASSWD';

var agt = navigator.userAgent.toLowerCase();
var is_ieindex = agt.indexOf('msie');
var is_ie = is_ieindex != -1;
var is_nav = ((agt.indexOf('mozilla') != -1) && (agt.indexOf('spoofer') == -1)
&& (agt.indexOf('compatible') == -1) && (agt.indexOf('opera') == -1) && (agt.indexOf('webtv') == -1));

createHiddenIFrame = function(sId, sName, targetDocument, sSrc)
{
var tDoc = document;

if (targetDocument)
tDoc = targetDocument;

var iframe = tDoc.getElementById(sId);

if (iframe)
{
if (sSrc)
iframe.src = sSrc;
return iframe;
}

if (sSrc == undefined || sSrc == null || sSrc == '')
sSrc = 'empty.htm';

if (is_ie)
{
var sHtml = "<iframe src='" + sSrc + "' style='display:none' id='" + sId;

if (( typeof (sName) != 'undefined') && (sName != null) && (sName.length > 0))
sHtml += "' name='" + sName;
sHtml += "'></iframe>";

iframe = tDoc.createElement(sHtml);

tDoc.body.appendChild(iframe);
}

else if (is_nav)
{
var iframe = tDoc.createElement('IFRAME');
iframe.style.visibility = 'hidden';
iframe.style.width = '0px';
iframe.style.height = '0px';
iframe.style.position = 'absolute';
iframe.id = sId;
iframe.src = sSrc;

if (( typeof (sName) != 'undefined') && (sName != null) && (sName.length > 0))
iframe.name = sName;

tDoc.body.appendChild(iframe);
}

return iframe;
};

removeIFrame = function(sId, sName)
{
if (is_ie)
{
if (!sName)
sName = sId;

var tIFrameObject = document.getElementById(sId);

if (tIFrameObject)
{
tIFrameObject.parentNode.removeChild(tIFrameObject);

if (is_nav)
delete window.frames[sName];
}
}
}

function SignOutIFrameOnLoad(event)
{
//alert('SignOutIFrameOnLoad');

var tBIPCallForm = document.getElementById('BIPCallForm');

if (!tBIPCallForm)
{
tBIPCallForm = document.createElement('FORM');
tBIPCallForm.setAttribute("name", 'BIPCallForm');
tBIPCallForm.method = "POST";
document.body.appendChild(tBIPCallForm);
}

tBIPCallForm.action = "http://" + sBIPHost + ":9704/xmlpserver/?id=" + sLogin;
tBIPCallForm.target = "_blank";

if (!tBIPCallForm.passwd)
{
if (is_ie)
tPasswdInput = document.createElement("<input name=\"passwd\">");

else
{
tPasswdInput = document.createElement("INPUT");
tPasswdInput.setAttribute("name", 'passwd');
}

tPasswdInput.setAttribute("type", "hidden");
tPasswdInput.value = sPasswd;

tBIPCallForm.appendChild(tPasswdInput);
}

tBIPCallForm.submit();

var sCallerIFrameID = 'SignOutIFrame';

removeIFrame(sCallerIFrameID);
}

function WindowOnLoad()
{
//alert('WindowOnLoad');
var tSignOutIFrame = window.frames['SignOutIFrame'];

if (!tSignOutIFrame)
{
tSignOutIFrame = createHiddenIFrame('SignOutIFrame', 'SignOutIFrame');
tSignOutIFrame.id = 'SignOutIFrame';
tSignOutIFrame.name = 'SignOutIFrame';

// // // // // // // // // // // // // //
// debugging
//tSignOutIFrame.style.display = '';
//tSignOutIFrame.style.visibility = "visible";
//tSignOutIFrame.style.height = '500px';
//tSignOutIFrame.style.width = '900px';
// // // // // // // // // // // // // //

tSignOutIFrame.onLoad = "SignOutIFrameOnLoad(event)";

tSignOutIFrame.attachEvent("onload", SignOutIFrameOnLoad);

document.body.appendChild(tSignOutIFrame);
}

var tSignOutForm = document.forms['SignOutForm'];

if (!tSignOutForm)
{
tSignOutForm = document.createElement('FORM');
tSignOutForm.setAttribute("name", 'SignOutForm');
tSignOutForm.method = "POST";
document.body.appendChild(tSignOutForm);
}

tSignOutForm.action = "http://" + sBIPHost + ":9704/xmlpserver/signout.jsp";
tSignOutForm.target = tSignOutIFrame.name;

tSignOutForm.submit();
}

window.onload = WindowOnLoad;
</script>
</head>
<body></body>
</html>


Как это использовать:
Сохраните этот код в виде HTML файла на локальном диске.
Исправьте значения переменных sBIPHost, sLogin и sPasswd на корректные в вашем окружении.
Откройте dummy-сеанс браузера.
Запустите только что отредактированный файл.
Посмотрите под кем зашли в интерфейс BIP.
Закройте этот сеанс браузера (дамми-сеанс не трогайте).
Отредактируйте файл снова - укажите другого пользователя и его пароль.
Вновь запустите HTML файл.
Посмотрите под новым ли пользователем вы оказались в интерфейсе BIP.

Для сравнения посмотрите что будет, если не закрывать дамми-сеанс и не делать программный logout. Для этого достаточно в приведенном коде присвоить window.onload не WindowOnLoad, а SignOutIFrameOnLoad.

Комментариев нет:

Отправить комментарий