当前位置: 首页 > 知识库问答 >
问题:

以编程方式在Liferay中将角色添加到用户

濮阳宁
2023-03-14

我需要在Liferay的用户登录应用程序时为他们分配角色。

我已经实现了实现“身份验证器”的自定义类的“身份验证器”方法中的所有逻辑。

示例代码:

public class ESBAuthenticator implements Authenticator{

      public int authenticateByScreenName(long companyId, String screenName, String password,
            Map<String, String[]> headerMap, Map<String, String[]> parameterMap)

              setProfile(companyId, screenname);
              return 1;
     }

     public static void setProfile(long companyId, long userId){
           User user = UserLocalServiceUtil.getUser(userId);
           Role liferayRole = RoleLocalServiceUtil.fetchRole(companyId, "Administrator");
           RoleLocalServiceUtil.addUserRole(user.getUserId(), liferayRole.getRoleId());
           UserLocalServiceUtil.updateUser(user);
     }
 }

当我登录时,很明显它可以工作,我检查liferay数据库的表并更新它们,我的用户分配了“管理员”角色。但是,前端的门户不显示“Admin”选项。

但如果我转到“我的帐户”,按“保存”按钮,注销并再次登录,我有可用的管理选项。

有人知道为什么会这样吗?,我在分配角色后调用“updateUser()”,它与“save”按钮不一样吗?

可能的解决方案:我发现,如果清除集群中缓存的内容,效果会很好。我在这篇帖子中找到了它:

https://www.liferay.com/es/web/kamesh.sampath1/blog/-/blogs/how-to-clear-liferay-cache

添加以下行:

MultiVMPoolUtil.clear();

有人知道这是正确的解决方案吗?,当按下“my_account”页面中的“保存”按钮时,我找不到什么。也许它清除了这个缓存?。我正在搜索与数据库同步的功能,但找不到任何东西。似乎是如果更新了列,如果缓存了:(。

共有3个答案

杨选
2023-03-14

我认为清除缓存的解决方案是有效的,因为您需要删除所有缓存的portlet repsones。这是my_account方法。

 // Clear cached portlet responses
 PortletSession portletSession = actionRequest.getPortletSession();
 InvokerPortletImpl.clearResponses(portletSession);

问题是InvokerPortletImpl外部不可见。要在功能上复制它,您可以尝试login.events.post并从Http会话e清除映射中获取响应缓存;

  httprequest.getSession().getAttribute("CACHE_PORTLET_RESPONSES").clear()

但这就像一个黑客,在这种情况下,MultiVMPoolUtil更好。清除();

段干俊茂
2023-03-14

当您调用该方法时,您正在传递屏幕名称

 setProfile(companyId, screenname);

但在ur setProfileMethod中,您使用的是用户ID

 public static void setProfile(long companyId, long userId){
           User user = UserLocalServiceUtil.getUser(userId);
           Role liferayRole = RoleLocalServiceUtil.fetchRole(companyId, "Administrator");
           RoleLocalServiceUtil.addUserRole(user.getUserId(), liferayRole.getRoleId());
           UserLocalServiceUtil.updateUser(user);
     }

使用方法

UserLocalServiceUtil.fetchUserByScreenName(companyId, screenName)
柯曦
2023-03-14

我可以给你一个便宜的黑客。

第1步:确保您拥有用户凭据。

第2步:根据需要更改用户角色等

步骤3:刷新与流相关的各种缓存(客户端或服务器)

步骤4:将用户重定向到临时视图,在该视图中,您持有的用户凭据将自动应用,然后重定向到门户。

让我知道它是否有效

 类似资料:
  • 我想以编程方式在liferay中添加站点,因此我创建了一个负责以编程方式添加站点的portlet,但它不起作用,所以请任何人在这方面帮助我。当我单击create site is时,我得到的错误是。这是我的代码: &这是我的sites.java,它是一个操作文件: 我的日志文件是:

  • 我正在尝试在Android上添加Wifi网络,我想知道如何连接到不广播其SSID的Wifi网络(它是否有空SSID或带有\0s的清晰SSID)。 这是我目前用于广播其SSID的Wifi网络的内容:

  • 我正试图在我的注册功能中为用户分配一个角色。 通过使用以下代码: 当我试图运行上面的代码时,我得到了以下错误。 E/AndroidRuntime:致命异常:AsyncTask#2进程:info,pid:967 java.lang.runtimeException:在Android.os.AsyncTask$3处执行doInBackground()时发生错误。done(AsyncTask.java:

  • 问题内容: 对于RealityKit的文档包括结构:,,和用于添加材料到。 或者,您可以在模型中加载带有附加材料的模型。 我想以编程方式添加自定义材料/纹理。如何在不向Reality Composer或其他3D软件的模型中添加材料的情况下即时实现这一目标? 问题答案: 已更新:2020年6月23日 。 目前,RealityKit 2.0中有4种类型的材料 : 简单材质 不发光材料 咬合材料 Vid

  • AndroidR、 属性。selectableItemBackground存在,但如何通过编程将其添加到ImageButton? 此外,我如何在文档中找到答案?这里提到过,但我看不到任何关于它实际如何使用的解释。实际上,我似乎很少发现文档有用,但我希望这是我的错,而不是文档的错。

  • 问题内容: 我想在头部分中以编程方式添加StyleSheets,但是我看到的示例之一似乎需要多行代码才能仅添加一个样式表,即使我可能需要很多: 示例代码: 我也使用方法,但是它也不起作用。对象null抛出了错误。 我也使用了和东西,但是它们抛出了文字错误,这是我认为的常见错误。 我使用此代码: 起初它起作用,但是当我更改页面时,它停止工作。 我正在使用“母版页”,并且正在文件中编写这些代码,也有人