OpenUI5路由和身份验证

时间:2019-03-23 14:39:22

标签: sapui5

我需要为我的OpenUI5应用程序实现一个全面的安全环境。我在服务器端生成session_iduser_id,并将它们同时保留在服务器端(在数据库中)和客户端(在sessionStorage中)。在这种情况下,会话存储在选项卡/页面关闭时被破坏的事实是一个优势。

onBeforeRendering事件中,我异步检查客户端的session_iduser_id是否与服务器端的匹配。

onBeforeRendering: function () {

    let currView = this;

    checkSession(sessionStorage.getItem("SessionId"),
        sessionStorage.getItem("UserId"), function (response) {
            if (!response.result) {
                let oRouter = sap.ui.core.UIComponent.getRouterFor(currView);
                oRouter.navTo("login");
            }
        });
}

这种模式并不能真正实现我所需要的。由于我异步进行检查,因此客户端有足够的时间来呈现该视图,并且该视图会显示一秒钟,然后用户重定向到登录页面。

此外,如果我复制内部URL(http://myapp:3000/#/productList),请关闭选项卡,然后将URL粘贴到新选项卡,则用户将被重定向回登录页面,但是他可以单击浏览器的“后退”按钮,带他到内部页面。

我设法通过在checkSession事件上实现相同的onRoutePatternMatched函数来部分地防止了这种行为,但是然后我遇到了同样的问题:页面在显示给用户一秒钟后路由给他返回登录页面。

我的另一种方法是处理导航事件,但是我不知道如何在单页应用程序中发现登录页面。

$(window).on("navigate", handleNavigate);
function handleNavigate() {
    let path = window.location.pathname;
    alert(path);
}

我的问题:
会话存储为空时如何防止用户访问内部页面。

1 个答案:

答案 0 :(得分:1)

您可以使用每次从服务器获取HTTP错误代码时触发的事件。是requestFailedhttps://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v2.ODataModel)的oDataModel

我想,每次加载页面时,请求都会发送到服务器吗?如果您没有正确的会话信息,您会得到401正确的信息吗?如果是这样,您可以收听该事件,并在返回401时做任何您想做的事情。

如果您使用jQuery提取数据,则可以使用ajaxError获得相同的结果。