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

时间:2015-12-21 16:03:34

标签: java login liferay user-roles

我需要在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数据库的表并且它们已经更新,我的用户已经&#34;管理员&#34;角色分配。但是,前端的门户网站并没有显示&#34; Admin&#34;选项。

enter image description here

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

任何人都知道为什么会这样?,我打电话给&#39; updateUser()&#39;分配角色后,它与“保存”不同。按钮?

可能的解决方案: 我发现,如果我清除整个群集中缓存的内容,它可以正常工作。我在这篇文章中找到了它:

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

添加以下行:

MultiVMPoolUtil.clear();

任何人都知道这是否是正确的解决方案?我无法在&#34;保存&#34;来自&#34; my_account&#34;的按钮页面被按下了。也许它清除这个缓存?我正在寻找与数据库功能同步,但无法找到任何东西。似乎如果一个列被更新,如果它被缓存,liferay就不会使用它:(。

3 个答案:

答案 0 :(得分:0)

我可以给你一个廉价的黑客。

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

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

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

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

Lemme知道它是否有效

答案 1 :(得分:0)

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

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

问题是InvokerPortletImpl在外部不可见。要在功能上复制,您可以尝试 login.events.post 并从HttpSession获取响应缓存并清除地图;

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

但在这种情况下它就像黑客一样更好MultiVMPoolUtil.clear();

答案 2 :(得分:-1)

当您调用方法时,您将传递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)