[英]Add role to User in Liferay programmatically
我需要在登录应用程序时为Liferay的用户分配角色。
我已经实现了实现“Authenticator”的自定义类的“authenticateByScreenName”方法中的所有逻辑。
示例代码:
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”页面中的“保存”按钮时,我无法找到liferay的内容。 也许它清除这个缓存? 我正在寻找与数据库功能同步,但找不到任何东西。 似乎是如果一个列被更新,如果它被缓存,liferay不会使用它:(。
我可以给你一个廉价的黑客。
第1步:确保您拥有用户凭据。
第2步:根据需要更改用户角色等
步骤3:刷新与流相关的各种缓存(客户端或服务器)
步骤4:将用户重定向到临时视图,您将自动应用您持有的用户凭据,然后重定向到门户。
Lemme知道它是否有效
我认为清除缓存的解决方案是有效的,因为您需要删除所有缓存的portlet repsones。 这是my_account这样做的方式。
// Clear cached portlet responses
PortletSession portletSession = actionRequest.getPortletSession();
InvokerPortletImpl.clearResponses(portletSession);
问题是InvokerPortletImpl在外部不可见。 要在功能上进行复制,您可以尝试登录.eff。来获取HttpSession的响应缓存并清除地图;
httprequest.getSession().getAttribute("CACHE_PORTLET_RESPONSES").clear()
但在这种情况下,它更像是一个黑客攻击MultiVMPoolUtil.clear();
当您调用方法时,您将传递screenName
setProfile(companyId, screenname);
但是在你的setProfileMethod中,你正在使用UserId
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.