# 管理员菜单维护

V8.1开始,标准产品对组织机构做了调整:全面开启了三元分离和三员角色化,在代码层面会有很大调整,详见如下信息。

# 需要修改

# AppContext.isXxxxAdmin

将旧版本左侧的代码用右侧写法替代:

AppContext.isGroupAdmin()==> orgHelper.isLoginGroupAdminRole()
AppContext.isAdministrator()==> orgHelper.isLoginUnitAdminRole()
AppContext.isAuditAdmin()==> orgHelper.isLoginGroupAdminRole()
AppContext.isSystemAdmin()==> orgHelper.isLoginGroupAdminRole()

# User.isXxxAdmin

将旧版本左侧的代码用右侧写法替代:

r.isGroupAdmin() ==> orgHelper.isLoginGroupAdminRole()
r.isAdministrator()==> orgHelper.isLoginUnitAdminRole()
r.isAuditAdmin() ==> orgHelper.isLoginGroupAdminRole()
r.isSystemAdmin() ==> orgHelper.isLoginGroupAdminRole()

# orgManager.getXxxx

将旧版本左侧的代码用右侧写法替代:

getSystemAdmin() ==> findSystemAdmin()
getAuditAdmin() ==> findAuditAdmin()
getGroupAdmin() ==> findGroupAdmin()
getAdministrator() ==> findAdministrator()

# 角色化管理员适配示例

由于角色化,系统管理员的菜单从原来固定的角色,变为多种组合,以前通过角色判断的是否具有某个菜单资源的方式不再合适。所以一般建议改为使用资源code判断权限。适配需要修改的点:

1、菜单配置文件。

2、修改@CheckRoleAccess配置。

3、修改原有的集团管理员、单位管理员区分逻辑。

4、验证业务功能。

# 菜单配置文件

ctp-organization\src\main\webapp\WEB-INF\cfgHome\metadata
metadata                                        
├─ entRoleStd                                   
│  ├─ menu-AccountAdministrator-A6.xml   //A6:单位管理员(原admin1账号)             
│  ├─ menu-AccountAdministrator-A6C.xml       //A6C:单位管理员(原admin1账号)          
│  ├─ menu-AccountAdministrator-Enterprise.xml  //A8-1:单位管理员(原admin1账号)    
│  ├─ menu-AccountAdministrator.xml  //系统管理员(原system账号)               
│  ├─ menu-AuditAdmin.xml   //审计管理员(原audit-admin账号)                        
│  ├─ menu-GroupAdmin.xml  //集团管理员(原group-admin账号)                         
│  └─ menu-SystemAdmin.xml  //系统管理员(原system账号)            
├─ govRoleStd                                   
│  ├─ menu-GroupAuditAdmin.xml    //三员-系统级-审计管理员                  
│  ├─ menu-GroupSecretAdmin.xml    //三员-系统级-安全管理员                         
│  ├─ menu-GroupSystemAdmin.xml    //三员-系统级-系统管理员                        
│  ├─ menu-UnitAuditAdmin.xml      ///三员-单位-审计管理员             
│  ├─ menu-UnitSecretAdmin.xml     //三员-单位-安全管理员       
│  ├─ menu-UnitSystemAdmin-A6.xml   //A6:三员-单位-系统管理员
│  ├─ menu-UnitSystemAdmin-A6C.xml    //A6c:三员-单位-系统管理员     
│  ├─ menu-UnitSystemAdmin-Enterprise.xml      //A8-1:三员-单位-系统管理员
│  └─ menu-UnitSystemAdmin.xml    //A8-2:三员-单位-系统管理员   
├─ menu-SystemInitAdmin.xml     //初始化管理员

# 配置文件说明

菜单配置文件包含两个部分菜单部分、资源code部分。

1、菜单部分用于配置系统管理员菜单入口、命名、图标等信息

2、资源code部分用于配置当前对应的管理员,没有菜单入口但是又要访问的资源code.

<?xml version="1.0" encoding="UTF-8"?>
<GroupAdmin>
    <!-- 菜单配置 -->
    <menus>
      <menu code="org_workscope_setting" sort="9" name="system.menuname.AccessLevelConfig" desc="工作范围管理" icon="icon-gongzuofanweiguanli" target="mainfrm" plugin="" url="/organization/workscopeController.do?method=showWorkscopeframe" ></menu>
    </menus>
    <!--配置有权限的资源code-->
    <virtualCode>
        <code>system_back_admin</code>
    </virtualCode>
</GroupAdmin>

下边我以组织机构_工作范围管理_、_特殊账号管理_适配过程为例,来说明怎么适配角色化后权限控制。

# 工作范围管理

1、为菜单定义资源code,命名建议{模块}_{子模块}_{功能},如果org_workscope_setting表示组织机构工作范围管理

// 修改前
<menu code="" sort="9" name="system.menuname.AccessLevelConfig" desc="工作范围管理" icon="icon-gongzuofanweiguanli" target="mainfrm" plugin="" url="/organization/workscopeController.do?method=showWorkscopeframe" ></menu>

// 修改后
<menu code="org_workscope_setting" sort="9" name="system.menuname.AccessLevelConfig" desc="工作范围管理" icon="icon-gongzuofanweiguanli" target="mainfrm" plugin="" url="/organization/workscopeController.do?method=showWorkscopeframe" ></menu>

2、修改后端@CheckRoleAccess配置

// 修改前
@CheckRoleAccess(roleTypes={Role_NAME.GroupAdmin,Role_NAME.AccountAdministrator,Role_NAME.HrAdmin})
public class WorkscopeController extends BaseController {
}

//修改后,将角色判断去掉,添加:resourceCode = "org_workscope_setting"
@CheckRoleAccess(roleTypes={Role_NAME.HrAdmin},resourceCode = "org_workscope_setting")
public class WorkscopeController extends BaseController {
}

# 特殊账号管理

1、菜单code定义

// 修改前
<menu code="" sort="7" name="system.menuname.Guest.special.accountManagement" desc="特殊账号管理" icon="icon-teshuzhanghaoguanli" target="mainfrm" plugin="vPortalAdvanced" url="/organization/guestController.do?method=showGuestframe" ></menu>

// 修改后
<menu code="org_gust_setting" sort="7" name="system.menuname.Guest.special.accountManagement" desc="特殊账号管理" icon="icon-teshuzhanghaoguanli" target="mainfrm" plugin="vPortalAdvanced" url="/organization/guestController.do?method=showGuestframe" ></menu>

2、修改@CheckRoleAccess

// 修改前
@CheckRoleAccess(roleTypes={Role_NAME.GroupAdmin,Role_NAME.AccountAdministrator})
public class GuestController extends BaseController {
}

//修改后,将角色判断去掉,添加:resourceCode = "org_workscope_setting"
@CheckRoleAccess(resourceCode = "org_gust_setting")
public class GuestController extends BaseController {
}

3、集团管理员与单位管理员区隔适配

// 修改前
public ModelAndView showGuestframe(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("apps/organization/guest/guestHome");
        User user = AppContext.getCurrentUser();
        boolean isGroupVer = (Boolean) (SysFlag.sys_isGroupVer.getFlag());
        mav.addObject("isGroupVer", isGroupVer);
        mav.addObject("isGroupAdmin", OrgHelper.isGroupAdmin());// 前端需要缺乏是集团管理员or  单位管理员
        mav.addObject("isAdministrator", OrgHelper.isAdministrator());// 前端需要缺乏是集团管理员or  单位管理员
        return mav;
}


// 修改后
public ModelAndView showGuestframe(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("apps/organization/guest/guestHome");
        User user = AppContext.getCurrentUser();
        boolean isGroupVer = (Boolean) (SysFlag.sys_isGroupVer.getFlag());
        mav.addObject("isGroupVer", isGroupVer);
        mav.addObject("isLoginGroupAdminRole", OrgHelper.isLoginGroupAdminRole());// 改为判断当前用户是否为集团的管理角色
        mav.addObject("isLoginUnitAdminRole", OrgHelper.isLoginUnitAdminRole());// 改为判断当前用户是否为单位的管理角色
        return mav;
}

# 废弃的组织机构变量

安全起见,以下变量废弃:

/**
     * 系统管理员预置ID
     * @deprecated 角色角色化后,废弃不再使用
     */
    public static final Long SYSTEM_ADMIN_ID = -72730320***L;
    /**
     * 审计管理员预置ID
     * @deprecated 角色角色化后,废弃不再使用,8.1后可能删除
     */
    public static final Long AUDIT_ADMIN_ID = -44016066***L;
    /**
     * 集团管理员预置ID
     * @deprecated 角色角色化后,废弃不再使用,8.1后可能删除
     */
    public static final Long GROUP_ADMIN_ID = 5725175934***L;
编撰人:admin