我需要在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”页面中的“保存”按钮时,我找不到什么。也许它清除了这个缓存?。我正在搜索与数据库同步的功能,但找不到任何东西。似乎是如果更新了列,如果缓存了:(。
我认为清除缓存的解决方案是有效的,因为您需要删除所有缓存的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更好。清除();
当您调用该方法时,您正在传递屏幕名称
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)
我可以给你一个便宜的黑客。
第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抛出了错误。 我也使用了和东西,但是它们抛出了文字错误,这是我认为的常见错误。 我使用此代码: 起初它起作用,但是当我更改页面时,它停止工作。 我正在使用“母版页”,并且正在文件中编写这些代码,也有人