权限接口设置
发布日期:2009-4-5 信息来源:http://www.chysoft.net

一、整体描述
表单系统部署在实际的运行环境中,有可能需要同相应的组织结构模型及权限系统结合,这样可以在已经存在业务系统权限的基础上同表单系统进行集成。
表单系统和业务系统的权限访问通过权限接口类实现,实现类中只需判断当前用户的身份。如:判断当前用户是否属于某一部门之下,判断是否属于某一用户组等。
接口实现类被表单的权限系统所调用,通过权限接口类访问指定的权限系统(权限代理机制)。
表单权限设置包括以下内容:
1、表单整体访问的权限设置,控制都某个表单的访问
2、字段权限设置,设置表单字段的访问权限
3、查询列表字段设置,设置查询列表中字段的操作、访问权限
4、表单部件权限设置,设置部件的访问权限
5、通过模板Action方式编码进行权限控制,详细见“开发指南”。
集成权限系统所需做的工作
A、开发权限接口实现类
B、编写权限表达式的设置界面程序
具体见“表单定制中如何处理应用权限

二、权限表达式
在进行授权之前,需先理解授权对象与权限表达。(说明:权限表达式原则上一般用户不需要编写、表单系统和具体的认证系统结合时由相应设置界面产生)
A、 授权对象(表达式)
  1、按用户U,格式:U[用户标志符]
 U[admin],判断当前用户的Id或其他标志是否为admin,匹配类型由实现类决定。
  2、按用户组G,格式:G[用户组标志符]
 G[1] ,判断当前用户是否为指定的用户组(1标志)
  3、按部门O,格式:O[部门标志符]
 O[aaa.dddddd.ll] ,判断当前用户是否属于指定组织下(aaa.dddddd.ll标志)。
  4、按资源授权:S
 S[资源Id],判断当前用户是否拥有对资源Id的访问权限。通过该方式可以将某个栏目授权和表单的访问授权绑定在一起,即:用户拥有某个栏目的访问权限及拥有对应绑定表单的访问权限。
  5、工作流权限:W
 W[标志符Id]系统调用,不能直接设置,按工作流方式授权,传递角色Id或其他的Id;
 不同的工作流执行到不同的步骤时,当前用户为不同的角色对表单资源拥有不同的访问权限,获取工作流权限类,判断当前用户的身份。
  身份判断步骤:工作流表达式--->权限询问接口--->工作流与表单的接口实现类--->根据传递参数返回身份判断结果。
B、 权限类型
1 代表读取,2代表修改,其它的为二进制值的扩展
C、权限表达式示例
权限表达式由授权对象表达式、权限类型及逻辑运算符组成。同一权限类型的在由一个大括弧包含,可以包含多个不同的授权对象表达式,左大括弧之前是权限类型,例:
2{U[admin] || O[x05]}1{G[1]},表示用户admin或者部门05拥有修改权限,而用户组1拥有读取权限。

三、系统配置管理
在设置表单权限之前须先在表单的“系统配置管理”指定权限接口实现类,权限接口实现类需根据不同的认证系统来编写,该类是实现net.sysmain.common.I_PermissionAccess接口的一个Java类,需实现public boolean isBelongToObjects(PermissionContext context, char identiferType, String identifer)方法,图示:


四、权限设置操作
1、表单权限设置
设置访问对象对表单的是否有访问权限(如没有访问权限,则系统提示对模板没有访问权限)。在设置时不能设置权限类型(权限类型只有一种,即是否可以访问),权限表达式中不包含权限类型和大括弧),操作步骤:
进入模板定义,修改模板属性
 
修改后不需要重新编译模板,如配置为运行状态,则进入“系统配置管理”刷新配置。
2、表单字段权限设置
设置访问对象对表单字段的访问权限。
进入模板定制,选择模板字段,右健菜单点击“权限设置”。图示:
 
修改后需保存模板并点击“系统生成”重新编译模板,如配置为运行状态,则进入“系统配置管理”刷新配置。
3、查询列表字段权限设置
设置访问对象对查询列表字段的是否有访问权限和操作权限,如果当前用户没有访问权限则该查询列表字段不显示;如果当前用户没有操作权限,则相关的链接操作不能操作而只能显示字段值。
在设置时不能设置权限类型(权限类型只有一种,即是否可以访问),权限表达式中不包含权限类型和大括弧
4、表单部件权限设置
根据不同的部件具体提供而设置,设置方式同“表单权限设置”。
5、Action权限控制
通过编写Action来控制对模板是否拥有访问权限。操作步骤
A、编写实现net.business.engine.common.I_TemplateAction接口的Java类,如果没有访问权限则抛出异常,或设置提示信息后返回失败状态 (具体见模板Action编写方法) 。
B、进入模板定义
C、修改模板属性,添加模板显示前的Action。
(修改后不需要重新编译模板,如系统配置为“运行状态”,则进入“系统配置管理”刷新配置。)

附:权限接口实现类,代码实例
package net.sysplat.access.external;

import net.sysmain.common.I_PermissionAccess;
import net.sysmain.common.PermissionContext;
import net.sysplat.access.Authentication;
import net.sysplat.common.Operator;

/**
 * 资源管理平台针对表单系统的权限接口*
 */
public class PermissionAccess implements I_PermissionAccess
{
private static PermissionAccess access = new PermissionAccess();

/**
* 该访问可选
* @return
*/
public static PermissionAccess getInstance()
{
return access;
}

private PermissionAccess()
{  
}

public static String getPermitJSFunction()
{
 return getPermitJSFunction(-1);
}

/**
* 返回权限的设置程序模态窗口
* @param method  设置方式
* 0显示权限类型
* 大于1 不显示权限类型
* @return
*/
 public static String getPermitJSFunction(int method)
 {
return " return window.showModalDialog(\"/sysplat/common/permission.jsp" + (method>0?"?method=1":"") +
"\", permitString, \"dialogWidth:570px;dialogHeight:546px;help: no;scroll:no; status:no\")";
 }

public boolean isBelongToObjects(PermissionContext context, char identiferType, String identifer)
{
boolean _is = false;
/**
* 获取用户信息
*/
Operator user = Authentication.getUserFromSession(context.getServletRequest());
if(user == null && !(identiferType == BASIC_USER_METHOD && identifer.equals("anonymous")))
{//如果用户未登录,且非匿名用户
return false;
}
switch(identiferType)
{
case BASIC_USER_METHOD://用户
/**
* 匿名用户
*/
if(identifer.equals("anonymous")) return true;
_is = identifer.equals(user.getHierarchy());
break;
case BASIC_ORGANIZE_METHOD://组织
_is = user.getHierarchy().startsWith(identifer);
break;
case BASIC_GROUP_METHOD:   //用户组
 /**
  * 考虑工作流的任务许可,如果工作流的任务许可不为空
  */
 String[] taskPermissionRole = (String[])context.getServletRequest().getAttribute(PermissionContext.DYNAMIC_ROLES);
 if(taskPermissionRole != null)
 {
  for(int i=0; i<taskPermissionRole.length; i++)
  {//判断是否为工作流任务节点指定的角色
if(taskPermissionRole[i].equals(identifer))
{
_is = true;
break;
}
  }
  if(!_is) break;
 }
_is  = user.isInGroupHierarchy(identifer);
break;
case 'C':
 _is  = user.isInGroupHierarchy(identifer);
break;
}

return _is;
}
}
说明:
1、 public boolean isBelongToObjects(PermissionContext context, char identiferType, String identifer)为接口实现必须实现的方法,
判断当前用户:
 是为某一用户
 属于某一指定的组织
 属于某一用户组
 其他根据具体的应用而设定
参数:
 context:权限上下文参数
 identiferType标志符的类型:用户、组织、用户组及其它
 identifer标志符,用户标志符(如:admin)、组织标志符、用户组标志符等
2、 权限设置窗口
通过权限设置窗口,返回/修改设置的权限表达式,以下方法为可选,如果不存在则显示系统缺省的权限表达式设置窗口。
/**
* 返回权限的设置程序模态窗口
* @param method  设置方式
* 0显示设置的权限类型
* 大于1 不显示设置的权限类型
* @return
*/
 public static String getPermitJSFunction(int method)

粤ICP备11095012号-1
Copyright 2005-2018 深圳市承元软件技术有限公司