【问题标题】:OpenUI5 routing and authenticationOpenUI5 路由和认证
【发布时间】:2019-03-24 00:45:33
【问题描述】:

我需要为我的 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 粘贴到新选项卡,用户将被重定向回登录页面,但随后他可以单击浏览器的后退按钮,这需要他到内部页面。

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

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

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

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

【问题讨论】:

    标签: sapui5


    【解决方案1】:

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

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

    如果你使用jQuery来获取数据,使用ajaxError可以获得同样的结果。

    【讨论】:

    • 那不是我的情况。我不使用 ODataModel。我使用异步请求从我的数据库中获取数据,然后将数据绑定到视图
    • jquery ajax,对吧?刚刚编辑了我的答案。干杯!
    • 不,我没有得到 401,因为我没有对 CRUD 操作使用用户级身份验证
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多