簡體   English   中英

以編程方式在Liferay中為用戶添加角色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM