2015-12-21 47 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更好();

相关问题