Доступ к пользовательской/унаследованной роли организации Liferay 6.1

Я использую Liferay 6.1 CE, Tomcat, Vaadin 6.8.4
Возможно, с моей стороны совершенно неверный подход или я упустил что-то очевидное.

Мне нужно контролировать функции crud для моих пользователей, разрешая доступ к организациям, которым они принадлежат, и любым дочерним организациям ниже этого. (Я использую таблицу Liferay organization_)

Пытаясь упростить администрирование разрешений, я надеялся назначить пользователя организации в иерархии. Затем можно определить привилегии по умолчанию из ролей, назначенных этой и любой родительской организации (организациям). Это, кажется, работает достаточно хорошо для обычных ролей, но затем я попытался создать пользовательскую роль организации и не смог получить детали, как ожидалось.

  • I can see the correct data in the control panel definition for the user.
    ( Liferay knows how to retrieve and display the custom Organization Role :-)

  • I can see the actual data values being populated in the back-end table usergrouprole.

  • I am able to detect this role for the default superadmin / owner (test@liferay)
    . . . but I cannot detect the role for other users :(

  • I have been using RoleLocalServiceUtil and GroupLocalServiceUtil without luck.

    Моя интуиция подсказывает, что нужно отказаться от моих «пуристских» представлений и вместо этого вернуться к знакомому пользовательскому запросу, но я хочу сначала посмотреть, есть ли у кого-нибудь другие предложения получше.

    В настоящее время я не знаю, как войти в код Liferay, чтобы найти соответствующий сегмент, поэтому, возможно, это вариант, если у вас есть материалы для чтения :)

    Подсказки?


  • person Robin Martin    schedule 30.10.2012    source источник


    Ответы (2)


    Это будет выглядеть некрасиво (потому что это так), но я думаю, вам нужно будет позвонить:

    UserGroupRoleLocalServiceUtil.hasUserGroupRole(long userId, long groupId, long roleId);
    

    Вообще говоря, есть (если не всегда) XYZLocalServiceUtil и XYZServiceUtil для таблицы XYZ.

    person rp.    schedule 30.10.2012
    comment
    Спасибо за подсказку @rp. . . XYZServiceUtil для таблицы XYZ. Это действительно помогло получить доступ к другим необходимым таблицам. - person Robin Martin; 02.11.2012

    В духе обмена вот пример кода для отображения разрешений.

    ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
    User i_user =  themeDisplay.getUser();
    PortletDisplay portDisplay = themeDisplay.getPortletDisplay();
    String myRootname = portDisplay.getRootPortletId();
    String strOrgGroupRoles = "";
    
    //== 1. Display permission provided to user by Organisation(Group) Roles
    //== 2. User is assigned to the org.
    //== 3. Org is a member of the OrgRole.
    //== 4. OrgRole has permission defined from current selected portlet permissions (action-key)
    List<UserGroupRole> ugRoles = new ArrayList<UserGroupRole>();
    ugRoles.addAll(UserGroupRoleLocalServiceUtil.getUserGroupRoles(i_user.getUserId() ) );
    for (UserGroupRole ugRole : ugRoles){
    
        //== For each role this user has allocated, display the Rolename and the Organisation
        strOrgGroupRoles += "'" +ugRole.getRole().getName() + "'  (roleId="+ugRole.getRoleId()+")";
        strOrgGroupRoles += " for organization '"+OrganizationLocalServiceUtil.getOrganization(ugRole.getGroup().getClassPK()).getName();
        strOrgGroupRoles += "' (groupId=" +ugRole.getGroupId()+ ")\n";
    
        //== Permissions for the role is harder to find - linked to a resource
        //== Data shows the `actionId` equates to relative action number column 'bitwiseValue' in `resourceaction`.
        //== Snag is ResourcePermission needs a tie-breaker of the portlet name, not just the roleId
        //== Get this from ThemeDisplay getRootPortletId()
        //==
        //== I think Liferay 6.1.0 API may be broken here:  ResourceActionLocalServiceUtil.getResourceAction expects String, String . . .
        //==  . . . yet the `bitwiseValue` column is BIGINT(20) so nothing is returned.
        //== This causes us to attack it from a different angle
        List<ResourcePermission> resourcePerms = new ArrayList<ResourcePermission>();
        resourcePerms.addAll( ResourcePermissionLocalServiceUtil.getRoleResourcePermissions(ugRole.getRoleId()) );
        for (ResourcePermission resourcePerm : resourcePerms){
    
            //== For each of the ResourcePermissions of this role, get the actionId (equals Role Permissions aka action-key)
            //== The link is a relative number, not unique in this table so ensure it is for this portlet only
            if ( resourcePerm.getName().equals(myRootname)){ 
                List<ResourceAction> resourceActions = new ArrayList<ResourceAction>();
                resourceActions.addAll( ResourceActionLocalServiceUtil.getResourceActions(myRootname)  );
                for (ResourceAction resourceAction : resourceActions) {
    
                    //== For each listed action, ensure it is the relative action number we want (actionId) 
                    if (resourceAction.getBitwiseValue() == resourcePerm.getActionIds() ) {
                        strOrgGroupRoles += " +-- action= " + resourceAction.getActionId() + "\n";
                    }   
    
                }   //== End of actionIds for this portlet
    
            }   //== End if this portlet only
    
        }   //== End ResourcePermissions for this role
    
    }   //== End roles for this user                
    

    ХТН

    Робин

    person Robin Martin    schedule 01.11.2012