从 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 在用户注销时保持 HTTP 请求处于活动状态
使用基于 Worklight 适配器的身份验证时如何获取正在注销的用户的 userIdentity