【问题标题】:Worklight: WL.Server.setActiveUser - Can't modify - Illegal State: Cannot change identityWorklight:WL.Server.setActiveUser - 无法修改 - 非法状态:无法更改身份
【发布时间】:2013-06-08 08:58:54
【问题描述】:

我正在尝试修改登录的用户身份,

var mydata="this is custom data array";

var user = JSON.parse(JSON.stringify(WL.Server.getActiveUser()));
           WL.Logger.debug("Before Update" + user.attributes);
           WL.Logger.debug(" displayName =" + user.displayName );
           WL.Logger.debug("isUserAuthenticated ="+ user.isUserAuthenticated );
           WL.Logger.debug("userId =" + user.userId );

          WL.Server.setActiveUser ("myAppRealm" ,{    userId: user.userId ,
               displayName: user.displayName,
               isUserAuthenticated: user.isUserAuthenticated,
               attributes: {  userdata: mydata   }
           } );
           WL.Logger.debug(" ---- Updateed user ---- "  );
           var user = JSON.parse(JSON.stringify(WL.Server.getActiveUser())); 

但它给出以下例外

response [/apps/services/api/myApp/common/query] success: /*-secure-
{"isSuccessful":false,"warnings":[],"errors":["Illegal State: Cannot change identity of an already logged in user in realm 'myAppRealm'. The application must logout first."],"responseID":"67","info":[]}*/ worklight.js:1097
Procedure invocation error. Illegal State: Cannot change identity of an already logged in user in realm 'myAppRealm'. The application must logout first. 

如何修改?

编辑:

@Xv。好吧,那个时候我需要在用户的会话对象中保存一些值。为此,我首先尝试如上所述修改用户对象,但后来我发现下面提到的 API 有助于在会话对象中检索、修改或添加值。

WL 6.3 文档:

访问 HttpServletRequest 对象。

  • WL.Server.getClientRequest

这使您可以直接访问 HttpServletRequest 对象,然后您可以像在 JEE 应用程序中一样使用它的所有方法。

例如:

WL.Server.getClientRequest().getSession().getAttribute("mykey") WL.Server.getClientRequest().getSession().setAttribute("mykey", myobj)

【问题讨论】:

  • 如果您可以使用您在 Anton 的回答的评论中描述的解决方法添加一个答案,那就太好了:它允许投票并简化链接。

标签: session ibm-mobilefirst adapter


【解决方案1】:
  1. 始终getActiveUser API 中提供 领域 名称,例如WL.Server.getActiveUser("myRealm")

  2. 就像错误消息所说 - 您不能更改活动用户身份,它是可变的。您需要做的是首先通过调用WL.Server.setActiveUser("myRealm", null) 处理现有用户身份,然后调用WL.Server.setActiveUser("myRealm", {...})

【讨论】:

  • 是的,我首先调用 WL.Server.getActiveUser("myRealm"),然后调用 WL.Server.setActiveUser。但我没有尝试先处理/删除现有用户身份,然后再次设置。但是我发现了另一种解决方法,对我来说看起来不错,它使用这种语法直接保存在 HTTPSession 中。 ( var obj= WL.Server.getClientRequest ().getSession().getAttribute("mykey")WL.Server.getClientRequest().getSession().setAttribute("mykey" , myobj) ) 在 Adapters 中声明了它。谢谢
  • @AAhad,请接受这个答案,或者写下你自己的答案并接受它。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2016-01-11
  • 2020-08-11
  • 2018-12-22
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多