所有由新葡京娱乐场发布的文章

MySQL触发器实现表数据同步

其中old表示tab2(被动触发),new表示tab1(主动触发,外部应用程序在此表里执行insert语句)

1、插入:在一个表里添加一条记录,另一个表也添加一条记录
DROP TABLE IF EXISTS tab1;
CREATE TABLE tab1(
tab1_id varchar(11)
);

DROP TABLE IF EXISTS tab2;
CREATE TABLE tab2(
tab2_id varchar(11)
);

创建触发器:t_afterinsert_on_tab1
作用:增加tab1表记录后自动将记录增加到tab2表中
delimiter || 
DROP TRIGGER IF EXISTS t_afterinsert_on_tab1 ||
CREATE TRIGGER t_afterinsert_on_tab1 
AFTER INSERT ON tab1
FOR EACH ROW
BEGIN
insert into tab2(tab2_id) values(new.tab1_id);
END||
delimiter ;

测试:
INSERT INTO tab1(tab1_id) values(‘0001′);

查看结果:
SELECT * FROM tab1;
SELECT * FROM tab2;

2、删除:在一个表里删除一条记录,另一个表也删除一条记录
delimiter || 
DROP TRIGGER IF EXISTS t_afterdelete_on_tab1||
CREATE TRIGGER t_afterdelete_on_tab1
AFTER DELETE ON tab1
FOR EACH ROW
BEGIN
delete from tab2 where tab2_id=old.tab1_id;
END||

测试:
DELETE FROM tab1 WHERE tab1_id=’0001′;

看看结果
SELECT * FROM tab1;
SELECT * FROM tab2;

java application中内嵌ActiveX控件

我这里用的是SWT/JFace开发application,SWT自带的org.eclipse.swt.ole.win32 包可以支

持内嵌OLE和ActiveX。

具体用法如下:

//创建一个OleFrame做为OLE(或ActiveX)的框架

OleFrame oleFrame = new OleFrame(this, SWT.NONE);

//创建ActiveX的容器,其中的classID是ActiveX的claid,在注册表中可以找到

OleControlSite oleControl = new OleControlSite(oleFrame, SWT.NONE, “classID”);

//OleAutomation类用来执行ActiveX中的方法

OleAutomation oleAutomation = new OleAutomation(oleControl);

//将ActiveX显示在application中

oleControl.doVerb(OLE.OLEIVERB_SHOW);

调用AcitveX中方法的具体过程:

1、不带参数的方法调用

//获取Method Name的ID,Method Name为ActiveX中具体的方法名

int[] regspid = oleAutomation.getIDsOfNames(new String[] { “Method Name” });

int dispIdMember = regspid[0];

//方法调用

oleAutomation.invoke(dispIdMember);

2、带参数的方法调用

//获取Method Name的ID,Method Name为ActiveX中具体的方法名

int[] regspid = oleAutomation.getIDsOfNames(new String[] { “Method Name” });

int dispIdMember = regspid[0];

//设置方法的具体参数。Variant数组的长度为Method Name方法参数的个数

//假设有四个参数

Variant[] rgvarg = new Variant[4];

rgvarg[0] = new Variant(fileID);

rgvarg[1] = new Variant(itdsURL);

rgvarg[2] = new Variant(idType);

rgvarg[3] = new Variant(reportURL);

//方法调用

oleAutomation.invoke(dispIdMember, rgvarg);

调用OLE Exemple:Java程序内嵌Word应用程序

package geftest.swt;

import java.io.File;

import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Point;

import org.eclipse.swt.layout.GridData;

import org.eclipse.swt.layout.GridLayout;

import org.eclipse.swt.ole.win32.OLE;

import org.eclipse.swt.ole.win32.OleClientSite;

import org.eclipse.swt.ole.win32.OleFrame;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Composite;

public class ActiveXTest

{

private Shell sShell = null;

private Button button = null;

private OleClientSite clientSite;

public static void main(String[] args)

{

Display display = Display.getDefault();

ActiveXTest thisClass = new ActiveXTest();

thisClass.createSShell();

thisClass.sShell.open();

while (!thisClass.sShell.isDisposed())

{

   if (!display.readAndDispatch())

    display.sleep();

}

display.dispose();

}

/**

* This method initializes sShell

*/

private void createSShell()

{

GridData gridData = new GridData();

gridData.horizontalSpan = 2;

GridLayout gridLayout = new GridLayout();

gridLayout.numColumns = 3;

sShell = new Shell();

sShell.setText(“Shell”);

sShell.setLayout(gridLayout);

sShell.setSize(new Point(800, 600));

OleFrame frame = new OleFrame(sShell, SWT.NONE);

button = new Button(sShell, SWT.NONE);

button.setLayoutData(gridData);

button.setText(“Save”);

button.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {

   public void widgetSelected(org.eclipse.swt.events.SelectionEvent e)

   {

    clientSite.save(new File(“d:/test.docx”),true);

   }

});

frame.setSize(800,600);

clientSite = new OleClientSite(frame, SWT.NONE,”Word.Document.8″);

clientSite.setSize(400,400);

clientSite.doVerb(OLE.OLEIVERB_SHOW);

}

}

分享到:

input lable水平对齐

1、CSS

<style type=”text/css”>
      input,label { vertical-align:middle;}
</style>

2、html

<label><input name=”chkGD” id=”chkGD” type=”checkbox” value=”” style=”border:none; background-color:#F4F4F4″ />加载供电方案</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<label><input name=”chkYS” id=”chkYS” type=”checkbox” value=”” style=”border:none; background-color:#F4F4F4″/>加载预算方案</label>

 

 

MINGW GCC 4.3.0 安装与配置(解决CREATEPROCESS问题)

首先,下载Mingw TDM 4.3.0版本
http://www.tdragon.net/recentgcc/

有两种选择
GCC 4.3.0-tdm-2 (Default SJLJ exceptions) 和 GCC 4.3.0-tdm-2 With DW2 Exceptions
可以根据SJLJ or DW2 (Dwarf-2) 异常模型来选择需要下载的版本,通常情况下win32平台下选择SJLJ(set jump long jump)模型

然后还需要去Mingw官网下载
binutils
http://downloads.sourceforge.net/mingw/binutils-2.18.50-20080109-2.tar.gz
mingw-runtime (mingw-runtime-3.14.tar.gz, 494KB) 
http://downloads.sourceforge.net/mingw/mingw-runtime-3.14.tar.gz
w32api (w32api-3.11.tar.gz, 1.55MB) 
http://downloads.sourceforge.net/mingw/w32api-3.11.tar.gz

也可以选择安装以下组件
mingw-utils
http://downloads.sourceforge.net/mingw/mingw-utils-0.3.tar.gz
mingw32-make(可以选择最新的mingw32-make-3.81-20080326-2)
http://downloads.sourceforge.net/mingw/mingw32-make-3.81-2.tar.gz
gdb(可以选择最新的6.8试验版)
http://downloads.sourceforge.net/mingw/gdb-6.6.tar.bz2

把这些东西都下载下来,然后解压到不同的目录,每个目录里面大概都会有bin,include,lib,man这样的目录,要做的就是合并它们,也就是拷贝到同一个目录里面,注意可能有些文件会重复,一般来说GCC 4.3.0 TDM包里面的文件比较重要,不要用其他的包里面的文件覆盖了它

然后就可以得到一个完整包含gcc,g++,binutils,gdb,make等的目录了,此时,在windows环境变量中的path变量里面添加该目录的bin子目录,就可以在cmd窗口中调用gcc和g++进行编译了。如果你不想污染了环境变量,也可以写个bat:(假设你的mingw目录是C:/mingw/bin)
set path=C:/mingw/bin;%path%”

现在还没有结束,需要进行两个地方的设置
1 make
mingw官方提供的make工具,名称不是简单的make,而是mingw32-make.exe,把它改名成make.exe或者复制一份为make.exe都可以

2 gcc: CreateProcess: No such file or Directory 错误
这个问题在google里面很多人发问,但是没有一个完整的解答,下面给出一个完整的解答
产生这个错误有两个原因:
第一是gcc无法找到安装目录里面的libexec目录里面的工具,通常这些工具包括cc1.exe,cc1plus.exe,collect2.exe,它们通常存放在:
安装目录/libexec/gcc/mingw32/4.3.0
第二是gcc无法找到mingw目录里面binutils的工具,它们通常存放在
安装目录/mingw32/bin
这两个目录的名字并不完全固定,根据不同组织编译的gcc各有不同,比如mingw官方编译的gcc4.3.0 alpha,上述目录就是
安装目录/gcc/i386-pc-mingw32/4.3.0
而官方提供的binutils包里面是
安装目录/i686-pc-mingw32/bin

只要这两个地方没有设置好,就可能导致CreateProcess错误,那么,有没有什么好办法能够确定这里应该怎样命名呢?办法是用16进制编辑器打开gcc.exe,搜索GCC_EXEC_PREFIX,当搜索到该字符串(不止一个)时,观察后面是否出现版本号4.3.0,如果出现,后面紧接着的就是路径,如果是mingw32那么上面的命名就应该是
安装目录/libexec/gcc/mingw32/4.3.0
安装目录/mingw32/bin

如果是其他的例如i686-pc-mingw32,那么名称相应的变为
安装目录/libexec/gcc/i686-pc-mingw32/4.3.0
安装目录/i686-pc-mingw32/bin

好了,可以测试一下你的hallo world程序了^_^

firefox浏览器不能使用window.close的解决方案

     javascript中window.close()函数用来关闭窗体,而且IE、google、firefox浏览均支持,但由于firefox浏览器dom.allow_scripts_to_close_windows参数默认值为false,故close不启作用。

    首先在firefox地址栏中输入about:config然后找到dom.allow_scripts_to_close_windows参数设置为true即可,如下图所示:

firefox浏览器不能使用window.close的解决方案

附 IE、google、firefox通用关闭窗口方法

 function closeWindow() {            var browserName = navigator.appName;            if (browserName == "Netscape") {                window.open('', '_self', '');                window.close();            }            else {                if (browserName == "Microsoft Internet Explorer") {                    window.open('', '_parent', '');                    window.close();                }            }        }

10个免费的javascript富文本编辑器(jQuery and non-jQuery)

祝愿园子里的朋友圣诞节快乐。

本文介绍了10个免费易用富文本编辑器(rich text editors,RTE),其中5个是Jquery插件,另外5个是非Jquery富文本编辑器

简介

Javascript富文本编辑器使我们添加、编辑网站中的文章更加方便和容易。这些富文本编辑器提供了所见即所得(What You See Is What You Get – WYSIWYG)的功能,可以像编辑word文档一样,方便地编辑网站中文章,常用于内容管理系统和博客系统等。

下面列出了常用的10个富文本编辑器,有最基础的格式富文本编辑器,也有复杂的具有文件上传能、创建表格功能、Ajax支持的富文本编辑器。

希望大家喜欢

MarkitUp – jQuery

Official Website | Demo

一个轻量级的、可定制的和灵活的富文本编辑器,常用在CMS、Blog、论坛等网站上。

markItUp不是一个所见即所得的编辑器,支持一些常用快车键和常用的浏览器。

jWYSIWYG – jQuery

Official Website | Demo

jWYSIWYG是比较常用的Jquery所见即所得编辑器,提供了html代码编辑功能、文字编辑功能,图片连接功能,从而保证了jWYSIWYG的简单的特性。

Lightweight RTE- jQuery

Official Website | Demo

Lightweight RTE是一个非常简单的Jquery富文本编辑器,体积只有7kb。提供了一些基本的文字格式化操作功能。

HTMLBox – jQuery

Official Website | Demo

HTMLBox跨浏览器、交互性非常好、开源的Jquery富文本编辑器,在Mozilla Firefox, Inrernet Explorer, Opera, Netscape and Safari等常用浏览器下测试通过。此编辑器用户手册可以帮住你非常容易地把此编辑器整合到自己的Web系统中

D Small Rich Text Editor – jQuery

Official Website | Demo

D Small Rich Text Editor使用了AjaxFileUpload 插件实现图片上传功能。

WYMEditor – jQuery

Official Website | Demo

WYMeditor是一个所建即所得Jquery富文本编辑器。支持插件扩展功能、

TinyMCE – non-jQuery

Official Website | Demo

TinyMCE 国内很多网站都在使用,是一个非常不错的所见即所得编辑器,而且开源。具体功能不再赘述,大家自己发现吧。

fckeditor – Non-jQuery

Official Website | Demo

Fckeditor是一个功能非常强大的富文本编辑器,博客园有使用此编辑器,我做的大部分项目也使用此编辑器,是asp.net网站的首选,提供了weconfig.xml文件用来定制符合自己需求的富文本编辑器。完全可以与MS的Word媲美。

Yahoo YUI Rich Text Editor – Non-jQuery

Official Website | Demo

YUI Rich Text Editor是轻量级的富文本编辑器,提供了一些常用的文字编辑功能。

Xinha – Non-jQuery

Official Website | Demo

Xinha是一个所见即所得的富文本编辑器,提供了强大的文字,图片。视频。音频等编辑功能

 

PKI与PMI技术 – 基于角色管理的系统访问控制

1. 引言(Introduction)
 1.1. 关键词定义(Definitions)
  有关定义说明如下:

  安全管理:计算机技术安全管理的范围很广,可以包括网络安全性、数据安全性、操作系统安全性以及应用程序安全性等。很多方面的安全性管理大都已经有成熟的 产品了,我们只需根据自己需要有选择性的使用就可达到自己的目的了。本文中有关关涉及”安全管理”一词均只针对本公司推出的应用中有关对象与数据而言范围 有限。

  主体:即可以象应用系统发出应用请求任何实体,包括各种用户、其它与本系统有接口的应用程序、非法入侵者。系统必须具有识别主体的能力,接口实际上也是由用户登记的,故主要问题是校验用户身份的合法性,系统应建立用户鉴别机构以验证用户身份。

  用户:用户就是一个可以独立访问计算机系统中的数据或者用数据表示的其它资源的主体,我们用USERS表示一个用户集合。用户在一般情况下是指人。

  权限:权限是对计算机系统中的数据或者用数据表示的其它资源进行访问的许可。我们用PERMISSION表示一个权限集合。可分为对象访问控制和数据访问控制两种。

  对象访问控制:用一个二元组来表示:(控制对象,访问类型)。其中的控制对象表示系统中一切需要进行访问控制的资源。我们将引入一套完整的资源表示方法来 对系统中出现的各类资源进行定义和引用(详见后述)。访问类型是指对于相应的受控对象的访问控制,如:读取、修改、删除等等。

  数据访问控制:如果不对数据访问加以控制,系统的安全性是得不到保证的,容易发生数据泄密事件。所以在权限中必须对对象可访问的数据进行按不同的等级给予加密保护。我们同样用一个二元组来表示:(控制对象,谓词)。

  权限最终可以组合成如下形式:(控制对象,访问类型,谓词)。

  角色:角色是指一个组织或任务中的工作或位置,它代表了一种资格、权利和责任。我们用ROLES表示一个角色集合。

  用户委派:用户委派是USERS与ROLES之间的一个二元关系,我们用(u,r)来表示用户u被委派了一个角色r。

  权限配置:权限配置是ROLES与PERMISSION之间的一个二元关系,我们用(r,p)来表示角色r拥有一个权限p。

2. 需求分析
  根据我们在本行业多年积累下来的经验,参考了其它同行的成功经验整合了先进的思想,我们有能力为我们自己的应用系统开发一套功能完善而且又灵活方便的安全 管理系统。使开发人员从权限管理重复劳动的负担中解放出来,专心致力于应用程序的功能上的开发。通过收集公司从事MIS项目开发经验丰富的软件工程师对在 各种情况下的对应系统的安性提出的需求做出了如下的总结。

  本系统在安全管理方面要考虑如下几个方面问题。

 2.1. 角色与用户
 
需求:
  角色由用户(这个用户与下一行的”用户”应该不是同一个定义,”客户”好像合适一些?不错,此处的用户确是有些偏于指向我们合同意义的客户,但是我认为与 下面定义的”用户”不存在什么本质上的区别,因为客户最终也是以在系统中登记的用户身份来使用本系统,用户所能完成的功能也就是客户的需求。两者之间的细 微区别读者可自己通过上下文加区分)自行定义,根据业务岗位不同可以定义多个角色。

  登录系统,首先需要向系统申请注册,同一个用户只能在系统中登记一次。

  用户是登录系统的楔子,角色是用户权限的基础。用户可以扮演多个角色。

  将某一角色授予某一用户时,权限不能超越该角色权限,但可以小于该角色权限。

  用户口令与数据库访问口令加密

  分析说明

  每个用户在系统中由一个唯的USERID标识。 
  用户通过系统登录界面登录系统,系统通过加密算法验证用户身份和判断用户是否已经登录系统。如果登录成功通知Application    preference service和安全管理系统保存用户登录信息。 
  角色由用户根据自己的设想的组织机构进行添加设置,提供一个专门的模块用来设置组织机构,用户通过组织机构(定义?部门机构还是后面提到的”机构是实现和 执行各种策略的功能的集合”)方便地进行角色管理。例如:用户可以通过部门机构来进行角色的管理,部门采用编号分层的方式,编号的每两位为一个层次。例如 一级部门编号为两位,二级部门编号为四位依此类推下去直到将全厂部门机构建立树状结构图。这类数据仅为方便用户管理角色而存在,在系统的其他方面不存在任 何意义。 
  每个角色在系统中也是由一个唯一角色编号来标识,同时必须保存用户所设置的机构信息,一般来说每个角色只需要保存自己所在机构的代码即可。 
 2.2. 菜单控制
  需求
此菜单乃系统业务功能菜单。由业务功能模块列表和用户菜单定制共同组成。每个用户可以拥有自己的菜单,也可以直接采用角色缺省菜单(当用户同时充当多个角色并且权限重复时,重复的权限仅一次有效)

  分析说明

  为了方便用户进行权限组织管理,需要在系统中建立一张业务功能模块列表,在用户界面上表示为树状分层结构。 
  业务功能模块以用户定制菜单来体现,仍然采用编号分层方式,编号的每两位为一个层次。并标明一个层次是子菜单还是业务模块,子菜单只有一种可否被访问的权 限设置,业务模块权限由系统管理员或授权用户进行设置。对每个业务模块设置它的对象控制、记录增删改控制和记录集控制。当用户拥有对业务模块的某一权限 时,必需对处于它上级的子菜单有可被访问的权限。删除某一个级子菜单时将提示用户他的下级菜单与功能模块都将被删除掉。 
  当用户同时充当多个角色并且权限重复时,重复的权限仅一次有效,用户拥有他充当的所有角色的权限的并集。 
  用户与角色拥有的系统权限查询时以业务功能模块列表的树状结构显示出来。 

 2.3. 对象控制
  需求
  对象是指应用系统窗口中的可视对象,如菜单项、按钮、下拉列表框、数据编辑控件及数据编辑控件的字段等。对象控制通过角色与用户授权来实现。

  对象控制包括对对象属性的控制可对数据编辑控件中的数据记录的维护权限:

  对象属性:使能/禁止、可视/屏蔽 
  记录维护:增加、删除、修改的组合 
  分析说明

  每个业务模块可进行属性设置的对象由程序员事先设定或由售后技术支持工程师指导用户加入。 
  在系统管理员或授权用户进行设置业务模块的每种权限时,设置用户在拥有该业务模块这种权限时的对象属性。没有设置属性的对象在保存对象信息的时候,用户权限信息中不被保存。 
 2.4. 记录集控制
  需求
  记录集的控制是通过条件设置来实现,因此,需要控制记录集的数据库表需要设置专门的记录集筛选字段,而筛选条件由用户根据岗位自进定义,建立过滤表,统一管理。

  分析说明

  在对用户设置业务模块权限时,同时在过滤表中设置本模块的数据编辑控件的数据筛选条件,筛选条件是组成SQL语句的WHERE条件子句迫使当前访问的模块根据筛选条件对数据编辑控件的SQL语句进行重组,并检索数据。 
  当存在需要从数据库中多个表取数据的情况时,过滤表中存在多条记录,每一条记录记录一个数据编辑控件取数的筛选条件。 
  SQL语句的WHERE子句的生成与校验可以通过的SQL语法分析服务,利用对象所提供的函数分析SQL语句,截取WHERE条件子句,校验新组合的SQL语句的合法性。 

 2.5. 权限分布管理
  需求
  上述提到的权限管理内容应该满足既可集中管理,也可分散管理的目标。

  分析说明

  权限管理由系统管理员集中管理,系统管理员工作负担过大,难对所有岗位的分工有全面和具体的了解,对权限作出标准细致的划分,对于大型的管理系统适合于把一部分设置权限的交由一些比较高级的用户来进行,有利于各岗位细致协调的工作。这就是权限的分散管理。 
  要实现权限的分散管理,就须对授权模块进行一些授权管理,这要求整个系统的授权安全管理工作要做到细致,不要出现权限的漏洞使一些高级用户拥有过大的权限。 
3. 方案设计
 3.1. 安全保护策略
  从上面各方面的需求分析来看,我们需要一套既行之有效,又方便灵活的安全管理方案。要采用各种控制机构和密码保护技术。安全保护策略是设计安全可靠系统的准则,通常涉及下列几个方面:

  区分安全策略与安全机构。  
  策略是信息安全性的高级指导,策略出自对用户要求,设备环境、机构规则、法律约束等方面的详细研究。策略重要性在于指导作用。而机构是实现和执行各种策略 的功能的集合。完善的机构是实施正确安全策略的物质基础。故一般要求机构能实现不同的策略,以便策略变动时无需要更换安全机构。

  安全策略: 企 业信息管理系统是一个大型的分布式数据资源管理系统,它包括信息量巨大以及不同程度的信息敏感度,各种有访问需求的用户,使得其安全管理非常复杂。基于角 色的系统安全控制模型是目前国际上流行的先进的安全管理控制方法。我们的安全管理系统也根据自身的需要有选择性的吸收其部分思想。其特点是通过分配和取消 角色来完成用户权限的授予和取消,并且提供了角色分配规则和操作检查规则。安全管理人员根据需要定义各种角色,并设置合适的访问权限,而用户根据其责任和 资历再被指派为不同的角色。这样,整个访问控制过程就分成两个部分,即访问权限与角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离,如 下图所示,角色可以看成是一个表达访问控控制策略的语义结构,它可以表示承担特定工作的资格。
                      PKI与PMI技术 - 基于角色管理的系统访问控制                                  

  由于实现了用户与访问权限的逻辑分离,基于角色的策略极大的方便了权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,加入代表新职 务或新任务的角色即可。研究表明,角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,并且委派用户到角色不需要很多技术,可以由行政管理人员 来执行,而配置权限到角色的工作比较复杂,需要一定的技术,可以由专门的技术人员来承担,但是不给他们委派用户的权限,这与现实中情况正好一致。除了方便 权限管理之外,基于角色的访问控制方法还可以很好的地描述角色层次关系,实现最少权限原则和职责分离的原则。

  安全保护机构: 本系统的安全保护机构基本上是于上面的安全策略相互适应的,系统保护的总体结构示意如下:
                PKI与PMI技术 - 基于角色管理的系统访问控制
  保护机构应负责阻止一切物理破坏和用户可能的操作破坏,后者归结为主体可用何种方式访问哪些对象。主体、访问类型、对象是我们  要讨论的保护机构主要成分 
  安全管理的职责: 安 全管理有集中管理与分散管理两种。前者意指一切权利都由负责系统安全工作的专职人员或小组组掌握,他(们)决定用户的访问权利,控制系统安全一切方面。后 者是指不同的管理员控制着系统安全的不同方面,管理系统的不同部分,决定不同用户的访问权利,甚至允许对象所有者转让访问对象的权利,集中管理,安全可靠 但不灵活;分散管理则应考虑避免漏洞和协调一致的问题。本系统因是针对大的集团企业管理的产品权限分配比较复杂,故采用了集中管理与分散管理相结合的形 式。 
  访问控制策略。 它提供决定用户访问权利的依据。其中最重要的一个普遍的原 则是”需者方知策略”(the need-to-know)。也就是说,只有一个工作需要的,才是他应该知道的。它从原则上限制了用户不必要的访问权利,从而堵截了许多破坏与泄露数据信 息的途经。按照这一原则授予用户的权利,是用户能完成工作的最小权利集合,故也称之为”最少特权策略”。 
  信息流动控制。 只限制用户的访问权利而不考虑数据流动是极其危险的。例如,在考勤时各部门的主管只能为自己部门的职员考勤,人事部可以提取全部数据,因此在提取数据时一定要加以限制。控制数据流动以防止无权用户在数据流动后获得访问权利。 
密码变换。对于非常机密数据可变换为密码存贮,使得不知道密码的入侵者无法破译所得到的数据密码。密码变换能防止泄密,但不能保护数据信息不被破坏。 
  软硬结合保护。 这是安全保护的基本策略,许多硬保护功能是软件难以实现的,有些即使能实现,效率也不高。 
  对安全遭到破坏的响应。各种保护机构都有可能遭到破坏,因此系统必须制订检测破坏手段与处置措施。 
 3.2. 安全管理机构分析
  3.2.1. 功能框架示意图

  内部总体功能框架图
                   PKI与PMI技术 - 基于角色管理的系统访问控制
  外调用的功能框架示意图
                       PKI与PMI技术 - 基于角色管理的系统访问控制
  3.2.2. 主要功能组件的职责
   3.2.2.1. 对象定义工具与权限定义工具

  对象定义工具。
  对象是指系统中各种功能模块、数据、界面元素(包括菜单、按钮等各种界面上能控制的控件)等,它们是主体能访问的各种对象。由于对象的机密程度不等,受到 的保护程度亦有差别。系统中的对象均由程序员通过系统提供的对象定义工具事先定义好系统要控制的对象。系统也只能控制这些事先已定义好的对象,因此,对象 定义是整个系统的核心步骤直接影响后面的各个安全控制环节。建议由开发程序员进行初始化配置。对象定义的包括如下几步: 
  功能模块定义:系统中除部分公用的界面、公用功能模块外,其它均为业务功能模块是用户完成各自不同的业务功能的主要算途径,也是我们安全管理要保护的重点 对象,所以我们必须对业务功能模块定义。有定义的功能模块对象我们就有可能组织权限根据用户需要完成的工作配置用户业务功能菜单,这也符合”最少特权策 略”。 
  界面元素控制:除了功能菜单要受到控制外,如要控制功能模块的界面元素其功能模块界面元素也需定义,大部分界面元素均包含有相关的业务功能操作,所以对相应操作的界面元素是进行定义是有必要的。 
  数据信息控制:业务功能模块的大部分界面元素是显示和操作数据内容的基础,也是用户对读取数据和操作数据的主要途径,为了数据信息的安全有必要对这界面元素的操作数据予以采取安全保密措施。这就需要对这些界面元素定义相关的数据约束条件。 
  对象定义(流程) 流程图如下
                        PKI与PMI技术 - 基于角色管理的系统访问控制
  权限定义工具。
  在定义好系统对象的前提下,定义对象的在不同情况的的访问类型,希望对象在不同情况下具有不同的访问类型,这就需要定义对象的权限。定义权限就是是定义对 象访问控制和数据访问控制。为了表述方便我们对权限用一个三元组符号来表示P(o,t,p),其中o 表示访问对象;t 表示访问类型;p 表示谓词。表示在谓词p为真时对于对象o可进行t类型的访问。权限定义系统安全管理基础步骤之一,只有给各种对象定义好访问的权限,才能给角色配置权限, 基于角色管理才能成为可能。系统提供定义权限工具,请程序员根据实际需求定义对象的权限。定义权限的流程图如下:
                          PKI与PMI技术 - 基于角色管理的系统访问控制       
   3.2.2.2. 角色定义与权限配置

  角色定义。
  基于角色的访问控制方法的思想就是把对用户的授权分成两部份,用角色来充当用户行驶权限的中介。这样,用户与角色之间以及角色与权限之间就形成了两个多对 多的关系。系统提供角色定义工具允许用户根据自己的需要(职权、职位以及分担的权利和责任)定义相应的角色。角色之间有相应继承的关系,当一个角色r1继 承另一个角色r2时,r1就自动拥有了r2的访问权限(表示r1->r2)。角色继承关系自然的反映了一个组织内部权利和责任的关系,为方便权限管 理提供了帮助。角色继承关系提供了对已有角色的扩充和分类的手段,使定义新的角色可以在已有角色的基础上进行,扩充就是通过增加父角色的权限去定义子角 色,分类通过不同子角色继承同一父角色来体现。另外还允许多继承,即一个角色继承多个父角色,多继承体现对角色的综合能力。角色定义示流程图如下:
                          PKI与PMI技术 - 基于角色管理的系统访问控制
  权限配置。
  角色是一组访问权限的集合,一个用户可以是很多角色的成员,一个角色也可以有很多个权限,而一个权限也可以重复配置于多个角色。权限配置工作是组织角色的权限的工作步骤之一,只有角色具有相应的权限后用户委派才能具有实际意义。权限配置流程图如下:
                         PKI与PMI技术 - 基于角色管理的系统访问控制
   3.2.2.3. 用户、用户组定义

  用户定义。
  系统的最终使用者是用户,因此必须建立用户的鉴别机构,登记用户的身份信息。在系统中定义可登录的用户操作系统是系统安全管理所必须步骤,也是人与系统的接口。 
  用户组定义。
  为了本系统适用于分散式权限管理,加入了用户组的概念,是指一群用户的集合。方便权限管理用户组也可以委派角色,当用户被加入用户组时自动对用户的所在用 户组拥有的角色进行了委派。为了便于分散式权限管理系统同时还支持对部分组的权限进行下发方式处理,授权特定的用户对用户组的用户权限进行管理。 
   3.2.2.4. 权限审查
  在授权完成后可检查登录用户所的拥有的能力表信息,审查给用户的权限是合适,如不合适可重新进行用户委派和收回部分权限的处理。目前系统只能以对用户组管理的模式对一个用户组内的用户可进行部分权限收回处理。

   3.2.2.5. 用户鉴别机构
  安全保护的首要问题是鉴别用户身份。目前有三种方法可用:第一、利用用户的物理特征(声波、指纹、相貌、签名)。这在理论是最可靠的,但由于物理特征可能 随时间变化且记录尚欠成熟等原因,使该方法未能广泛应用。第二、利用用户特有的证件,如身份证、机器可读卡先考片,其缺点是证件可能被别人复制或冒用。第 三、利用用户知道的某件能证明其身份的约定(如口令)。这是当前较为常用的方法。本系统采用第三种方法。

用户名称 标识 其它情况 
CHENDA GOOD  … … 
 … …   … …   … … 

  如上表所示是用户鉴别机构保存的一张登记有每个用户名称、标识和有关情况的表,表中的用户名通常是公开的,标识则是保密的,当用户要访问系统时,须首先把 自已的名称和标识登记到系统中(即出示证件)。这时用户鉴别系统机构检查用户的标识是否与用表中的标识一致,是则认为用户身份己得到证实,否则认为是假 冒,系统将拒绝用户要求执行的操作。口令是最常用的一种标识,通常由若干字母、数字组合而成。系统只允许用户连续两次或三次登记口令,如果都不对则要等待 一段较长的时间才成重新登记,这种延长时间的方法能够有效的防止冒名者猜测口令的可能。

   3.2.2.6. 访问控制机构
  杜绝对系统非法访问主要方法是访问控制。用户系统的访问规则可以用访问规则表示,根据安全策略用访问规则给0用户授权。访问控制就是要处理怎样表达和核对 访问规则的问题。从形式上来说,一条访问规则可以写成四元组的形式(u,o,t,p)可前已有权限表示形式重新表示为(u,P)。系统的访问控制分为模块 级控制和界面元素级控制。
                    PKI与PMI技术 - 基于角色管理的系统访问控制          

  存贮和检查访问规则是访问控制机构须解决的部问题。本系统为考虑运行速度根据系统中角色、权限配置、用户委派等关系动态地的组成一张用户能力表保存在系统 中根据上述配置信息改变由系统动态生成和保存。能力表(也称C-表)是存贮和核对访问规则的一种有效形式。能力表是面向主体的,用以说明主体能对那个访问 对象执行何种操作。能力表的基本形式如下:

Si (oi1,ti1,pi1)   ……….. (oij,tij,pij) 

 
  其中Si表示第I个主体;j为Si可访问的数据对象的个数;(oi1,ti1,pi1)为访问权限。全部主体的能力表的集合即为系统的全部访问规则。当某个访问请求需进行生效检查时,则按访问请求的主体找到能力表逐项核对以决定其是否有效。

  安全管理控制核心
  安全管理控制核心是系统安全管理的核心控制部分,它在系统中控制整个系统的安全控制工作,由它决定系统是否启动安全管理,在什么情况下调用访问控制机构,根据情况编写访问规则,如何将已有的访问规则应用于控制,存贮访问规则。

4. 系统评价
 4.1. 系统特点(自评)
  安全管理系统核心思想是在基于角色控制思想的基础上提取改进而来的,上述功能模型能较好満足产品开发人员提出的系统访问控制需求。分析如下:

  实现了系统开发过程中的职责分离,系统的安全管理部分被作为整个系统的核心控制部分,单独的被分离出来制定一些整个系统通用的安全准则。程序员在开发时不要过多的考虑程序安全性的问题只需要遵系统的安全准则即可,而是把主要精力花费在系统的业务功能上。 
有效的利用系统已有的资源减少系统的冗余,使系统的条理更加清楚。对已有功能模块只需设置不同的特征参数和对各种界面元素实施不同的访问类型控制,就能产生不同控制效果不需程序员再进行编写程序的工作。 
基 于角色对用户组进行访问控制:对一组用户比对单个用户进行访问控制更加合理,用户组代表了具有相近工作性质的一组用户的集合,可以委派完成用户组工作的角 色以控制用户组的权限范围(当然我们也可以把角色看成是我们系统中一个特定用户组)。同时支持角色的继承和多继承。通过改变用户的当前角色集就可以改变用 户的权限,而改变某种角色所含的权限时又可以改变一组用户的权限,基于这种访问控制方式有3个方面的作用:(1)简化了权限管理,避免直接在用户和数据之 间进行授权和取消。研究表明,用户所具有的权限易于发生改变,而某种角色所对应的权限更加稳定;(2)有利于合理划分职责,用户只有其所应具有权限,这样 可以避免越权行为,有关用户组的关系描述正是对此的支持;(c)防止权力滥用,敏感的工作分配给若干个不同的用户完成,需要合作的操作序列不能由单个用户 完成。 
  支持动态地改变用户的权限:安全管理考虑了访问权限不是静态,而是动态的情况。所有对象的权限均用三元组来表示P(o,t,p)主体在系统中的访问规则用 四元组来表示(s,o,t,p)。当产品系统使用工作流时,可通过产品平台与安全管理控制核心的接口,重新为编写访问规则,动态修改主体能力表。动态分配 用户完成当前工作流环节所需的权限。 
权限的相互关联:各种权限不是互相独立而是相互关联的,而且权限可以有感知其它用用户操作,这可以描述有关协同权限。功能例如在给数据编辑控件授权只读权限时,收回用户对数据插入和删除权限,该权限允许感知其它用户的操作,诸如某用户改变了数据等等。 
提供方便的授权/取消机制和检查机制:只要进行简单的赋值操作即可完成授权,同时由角色分配规则和主体访问规则控制则指导模型式的应用。 
  用户之间的授权关系:依据角色指派关系,运行系统中的用户自身可以对角色进行管理,这提供了又一种动态改变用户权限的手段。通常,角色指派的权力都在系统中具有管理责任的用户手中。 


作者简介 
郝 斌,北京辰冲公司驻长办事处软件工程师。目前任IMIS项目经理,主要从事企业信息管理系统和电子商务系统的开发工作,主要研究兴趣是java编程、 java企业应用解决组合,EJB/JMS/JAVAMAIL等。您可以通过电子邮件 hb_email@371.net 跟他联系。

Enterprise Architect’s Engineering Code Template Framework Code Templates

The Code Template Framework consists of a number of base templates. Each base template transforms particular aspects of the UML to corresponding parts of object-oriented languages.

The following table lists and briefly describes the base templates used in the CTF.

Template

Description

Attribute

A top-level template to generate member variables from UML attributes.

Attribute Declaration

Used by the Attribute template to generate a member variable declaration.

Attribute Notes

Used by the Attribute template to generate member variable notes.

Class

A top-level template for generating Classes from UML Classes.

Class Base

Used by the Class template to generate a base Class name in the inheritance list of a derived Class, where the base Class doesn’t exist in the model.

Class Body

Used by the Class template to generate the body of a Class.

Class Declaration

Used by the Class template to generate the declaration of a Class.

Class Interface

Used by the Class template to generate an interface name in the inheritance list of a derived Class, where the interface doesn’t exist in the model.

Class Notes

Used by the Class template to generate the Class notes.

File

A top-level template for generating the source file. For languages such as C++, this corresponds to the header file.

Import Section

Used in the File template to generate external dependencies.

Linked Attribute

A top-level template for generating attributes derived from UML Associations.

Linked Attribute Notes

Used by the Linked Attribute template to generate the attribute notes.

Linked Attribute Declaration

Used by the Linked Attribute template to generate the attribute declaration.

Linked Class Base

Used by the Class template to generate a base Class name in the inheritance list of a derived Class, for a Class element in the model that is a parent of the current Class.

Linked Class Interface

Used by the Class template to generate an Interface name in the inheritance list of a derived Class, for an Interface element in the model that is a parent of the current Class.

Namespace

A top-level template for generating namespaces from UML packages. (Although not all languages have namespaces, this template can be used to generate an equivalent construct, such as packages in Java.)

Namespace Body

Used by the Namespace template to generate the body of a namespace.

Namespace Declaration

Used by the Namespace template to generate the namespace declaration.

Operation

A top-level template for generating operations from a UML Class’s operations.

Operation Body

Used by the Operation template to generate the body of a UML operation.

Operation Declaration

Used by the Operation template to generate the operation declaration.

Operation Notes

Used by the Operation template to generate documentation for an operation.

Parameter

Used by the Operation Declaration template to generate parameters.

The second table lists templates used for generating code for languages that have separate interface and implementation sections.

Template

Description

Class Impl

A top-level template for generating the implementation of a Class.

Class Body Impl

Used by the Class Impl template to generate the implementation of Class members.

File Impl

A top-level template for generating the implementation file.

File Notes Impl

Used by the File Impl template to generate notes in the source file.

Import Section Impl

Used by the File Impl template to generate external dependencies.

Operation Impl

A top-level template for generating operations from a UML Class’s operations.

Operation Body Impl

Used by the Operation template to generate the body of a UML operation.

Operation Declaration Impl

Used by the Operation template to generate the operation declaration.

Operation Notes Impl

Used by the Operation template to generate documentation for an operation.

The base templates form a hierarchy, which varies slightly across different programming languages. A typical template hierarchy relevant to a language like C# or Java (which do not have header files) is shown in the example diagram below. In this diagram the templates are modeled as Classes (in reality they are just plain text). This hierarchy would be slightly more complicated for languages like C++ and Delphi, which have separate implementation templates.

Each of the base templates must be specialized to be of use in code engineering. In particular, each template is specialized for the supported languages (or ‘products’). For example, there is a ClassBody template defined for C++, another for C#, another for Java, and so on. By specializing the templates, you can tailor the code generated for the corresponding UML entity.

Once the base templates are specialized for a given language, they can be further specialized based on:

  • A Class’s stereotype
  • A feature’s stereotype (where the feature can be an operation or attribute)

This type of specialization enables, for example, a C# operation that is stereotyped as «property» to have a different Operation Body template from an ordinary operation. The Operation Body template can then be specialized further, based on the Class stereotype.

Enterprise Architect's Engineering Code Template Framework Code Templates

Note:

The above Class Model shows the hierarchy of Code Generation templates for a language such as C# or Java. The Aggregation connectors denote references between templates.

时间盒策略–让你必胜的15种秘诀

简单地说,时间盒是我所知道的最有效的时间管理方式。即使在某种程度上你已经知道如何使用它,但通过下面的策略你肯定会做得更好!

对于新手来,简单地说,时间盒就是把时间段分配到一个或一组任务。在特定的时间去完成任务而不是直到它已经完成了才去做它。

但不要让这个简单的概念欺骗你—-它可比你眼中的要更有用。

许多人已经介绍过它,尽管他们的工作卓有成效,但我还是想分享以下15种策略,它会使你更有成效:时间盒策略--让你必胜的15种秘诀

1.在重大工作中取得进展。

最显而易见的策略就是在重大工作中取得进展。一方面,它会使你在持续在此类工作中保持效率,还可以确保这些工作不会蔓延到8小时以外。

2.除去零碎的工作

时间盒是一种有效除去那些烦人的,细小的事情的方法。这些零碎工作本身就是问题,可以当作无意义的事情延迟去做。但是不久的将来,你会发现它们有足够的力量是你筋疲力尽。好的策略就是“索讨”所有精力建立一个时间盒然后一口气把他们完成。

3.拒绝拖延

如果你做事拖拉,或者忘了去做,你就把它放进时间盒吧!你将克服阻力完成工作,当时间到了的时候,你将有更大的动力去继续工作。

那么,如果拖延是你的问题,那就请忘掉闹铃的嗡嗡声吧,我建议使用“开放的时间盒”,你应该设定你所能承受的工作时间最小限度。对于这种时间盒,我常常把闹铃设成掌声雷动来给自己一点点鼓励。

4.征服完美主义

完美主义是拖拉的另一种形式,你对他投入过多的注意力而不去完成它,这时时间已经流逝,为了避免完美主义和效率的递减,你可以使用的最好建议就是定时的消减时间。

5.集中注意力

 

6.提高效率

7.激发动力

8.建立“模糊的”目标

9.创新的探索

10.掌握时间的去向

11.创造工作节奏

12.使工作有意义

13.平衡生活

14.堵住时间流向

15.奖励自我

搭建iOS的Web开发环境

现在,越来越多的iOS项目需要用到Web开发技术,尤其是HTML5方面的。

如果是开发标准界面的Web开发,可以使用Dashcode,我打算另写一篇文章介绍。这里的开发环境,是针对自定义界面的,从应用范围来看,也更广泛一些。

开发环境

首先是开发环境,因为比较熟悉Eclipse,使用的是Eclipse插件WTP来开发Html、Css和Javascript。我直接安装的是 SpringSource Tool Suite(是Spring定制的Eclipse版本,带wtp插件),因为后续还要使用Grails开发服务器端的动态内容。

搭建iOS的Web开发环境

创建和开发过程

使用SpringSource Tool Suite(STS)中的wtp,可创建静态web项目:

搭建iOS的Web开发环境

创建的项目截图:

搭建iOS的Web开发环境

部署和测试

静态的html页面,可以直接在浏览器中调试。

调试好以后,需要在iOS设备或者模拟器上测试。这需要两个条件:

  • 要有wifi环境,iOS设备(模拟器)通过wifi访问页面;
  • 要有http服务器,用来发布这些静态页面。

原本想使用Mac上自带的Apache http服务器,可通过系统设置调出:

搭建iOS的Web开发环境

这种方式配合Dashcode很好,但不可更改网站路径,配合wtp使用比较麻烦。另外,我也不想使用jetty或者tomcat,觉得测试静态内容没有必要。

决定使用轻量级的http服务器lighttpd。我是通过brew安装的,如果没有安装,可参考这里:安装和使用HomeBrew 。安装很简单,在终端输入命令:

brew install lighttpd

安装后不可直接运行,需要编写配置文件,比如这样:

server.document-root = “/Users/marshal/git/studioSite/html5demo/WebContent”

server.port = 80

mimetype.assign = (
“.html” => “text/html”,
“.txt” => “text/plain”,
“.jpg” => “image/jpeg”,
“.png” => “image/png”,
“.css” => “text/css”,
“.js” => “text/javascript”
)

index-file.names = ( “index.html” )

这里的server.document-root 指向项目html页面的根目录。

然后,可执行命令:

sudo /usr/local/sbin/lighttpd -D -f lighttpd.conf

这里要sudo,因为需要使用端口的权利。

好了,现在可以通过iOS设备浏览器,通过网址访问了。