2015-12-21 26 views
5

我需要的角色,當他們登錄應用程序分配給我的Liferay的用戶。添加角色到用戶的編程Liferay的

我已經實現所有的邏輯在「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數據庫的表和它們被更新,我的用戶「管理員」的角色分配。但是,前端的門戶網站不顯示「管理員」選項。

enter image description here

,但如果我去「我的賬戶」,按「保存」按鈕,註銷和登錄再次我有管理員選項可獲取。

任何人都知道爲什麼會發生這種情況?我在分配角色後調用'updateUser()',它與'save'按鈕不一樣嗎?

可能的解決方案: 我發現如果我清除羣集中緩存的內容,它可以正常工作。我發現它在這個帖子:

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

添加以下行:

MultiVMPoolUtil.clear(); 

任何人都知道,如果這是正確的解決方案?我找不到什麼呢Liferay的時候,「保存「按鈕從」my_account「頁面被按下。也許它清除了這個緩存?我正在尋找與數據庫功能同步但找不到任何東西。這似乎是,如果一列被更新,Liferay的不使用它,如果它的緩存:(

+0

它是預先驗證者還是後驗證者?我相信,如果它的後驗證程序,然後用戶上下文將不會更新與管理員權限。 –

+0

它是預認證者:S。 – dgcipp

+2

請改用'UserLocalServiceUtil.addRoleUser(long roleId,long userId)'! –

回答

0

我可以給你一個便宜的黑客

第1步:請確保您有用戶保持憑證

步驟2:執行如需要改變用戶的角色等

步驟3:沖洗相關的流各種高速緩存的(客戶端或服務器)

步驟4:將用戶重定向到一個您將持有的用戶憑證自動應用於臨時視圖然後重定向到門戶。

還是讓我知道它是否有效

+0

我很抱歉,但我不再在這個項目上工作:(。 – dgcipp

+0

哦!我錯過了看到發佈的日期。 –

-1

當你調用這個方法你逝去的屏幕名

setProfile(companyId, screenname); 

但烏爾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) 
0

我認爲清除緩存的解決方案是可行的,因爲您需要刪除所有緩存的portlet repsones。這是my_account這樣做的方式。

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

問題是InvokerPortletImpl在外部不可見。要複製這個功能,你可以嘗試一個login.events.post並從HttpSession中獲取響應緩存e清除地圖;

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

,但它像一個破解其在這種情況下MultiVMPoolUtil.clear更好();

相關問題