从 LDAPRealm 注销 Worklight LDAP 身份验证

Posted

技术标签:

【中文标题】从 LDAPRealm 注销 Worklight LDAP 身份验证【英文标题】:Worklight LDAP Authentication logout from LDAPRealm 【发布时间】:2014-10-31 09:54:58 【问题描述】:

我正在尝试使用 IBM Worklight Studio 6.2.0.01 制作 LDAP 身份验证系统

登录系统工作正常,该部分没有问题,但注销功能实际上并没有注销用户!

领域:

<realm loginModule="LDAPLoginModule" name="LDAPRealm">
    <className>com.worklight.core.auth.ext.FormBasedAuthenticator</className>
</realm>

登录模块:

<loginModule name="LDAPLoginModule">
    <className>com.worklight.core.auth.ext.LdapLoginModule</className>
    <parameter name="ldapProviderUrl" value="<Correct LDAP URL ( For security left blank on *** )>"/>
    <parameter name="ldapTimeoutMs" value="2000"/>
    <parameter name="ldapSecurityAuthentication" value="simple"/>
    <parameter name="validationType" value="exists"/>
    <parameter name="ldapSecurityPrincipalPattern" value="username"/>
</loginModule>

安全测试:

<customSecurityTest name="LDAPSecurityTest">
    <test realm="wl_directUpdateRealm" step="1"/>
    <test isInternalUserID="true" realm="LDAPRealm"/>
</customSecurityTest>

AdapterXML(重要部分)

<procedure name="getUsername"  securityTest="LDAPSecurityTest" />
<procedure name="onLogout" />

AdapterJS

function getUsername()
    return username: "";


function onLogout()
    WL.Server.setActiveUser("LDAPRealm", null);

应用程序每次想要检查用户当前是否登录时都会调用 getUsername 函数,除此之外没有其他功能。

注销功能(App端)

$scope.setUsername = function()
    var invocationData =  adapter: "DummyAdapter", procedure: "getUsername" 
    WL.Client.invokeProcedure(invocationData, 
        onSuccess: function(result), 
        onFailure: function(result));


$scope.logout = function()
    WL.Client.logout("LDAPRealm", onSuccess: $scope.setUsername);

结果:这使应用程序通过注意到用户已注销来进入登录页面,唯一的问题是.. 它还没有完全注销用户。我该怎么做才能让用户完全退出?

PS: 为什么我不在 WL.Client.logout() 之后使用 WL.Client.reloadApp?两个原因:

    白屏和重新加载整个应用程序太脏了,一点也不友好。 WL.Client.reloadApp 在 android Lollipop (Android 5.0) 上发出致命信号 11(代码 1)。至少,这是我的工作灯版本 (6.2.0.01)。

,有没有办法可以避免 WL.Client.reloadApp 并且仍然从服务器注销用户?如果不是:什么可能导致 Android Lollipop 中的致命信号 11(代码 1)错误?我已经在 ios 8.0、Android 2.3.5、Android 4.4.2 和 Android 5.0 上对其进行了彻底的测试。只有一个失败的是 5.0

谢谢你,很抱歉发了这么长的帖子

【问题讨论】:

嗨。虽然我没有适合您的解决方案,但我确实想让您知道 WL.Client.reloadApp 无法在 Android 5.0 中运行的错误正在调查中。感谢您的报告。 我已经为我的应用程序找到了一个解决方法,这涉及到根本不必使用 WL.Client.reloadApp()。我还测试了 WL.Client.reloadApp 没有其他任何东西。我的意思是:没有 AngularJS,没有 Ionic,没有任何东西。只有纯 html css 和 javascript。它仍然只在 android 5.0 上崩溃 谢谢。您能否写下您的解决方案作为其他人从中受益的答案? 好的,刚刚发布了 【参考方案1】:

我已经通过从注销成功中删除 WL.Client.reloadApp 函数解决了这个问题,我这样做了:

$scope.logout = function()
        WL.Client.logout("LDAPRealm", onSuccess: function() 
            $scope.setUsername() // <-- this function is the secret function
                                 //     that triggers the securitytest
                                 //     which then gives back the login page because
                                 //     you had just logged out :)
        );

至于适配器未注销用户:此评论是错误的,此错误源于另一个问题。所以我在 *** 上发布的代码很好。但还是:

Android 5.0 和 WL.Client.reloadApp 运行不佳(2014 年 11 月 5 日,以防更新解决此问题)

【讨论】:

编辑:即使 WL.Client.reloadApp 可以工作,我仍然更喜欢这个,因为这个解决方案不会给用户一个闪烁的屏幕。哪个更人性化

以上是关于从 LDAPRealm 注销 Worklight LDAP 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

注销和记住会话的最佳 Worklight 实践

Worklight 在用户注销时保持 HTTP 请求处于活动状态

使用基于 Worklight 适配器的身份验证时如何获取正在注销的用户的 userIdentity

IBM Worklight 6.0 - 如果客户端注销/登录,具有基本身份验证的适配器不会更新身份验证标头

[zeppelin] 支持多组LdapRealm登录

[zeppelin] 支持多组LdapRealm登录