及输入验证工作-->
<script language="javascript">
//在一个例表框中插入一项
function InsertItem(ListObj,ListText,ListValue)
{ len=ListObj.length;
ListObj.options[len] = new Option(ListText,ListValue);}
//将例表框中指定的项删除
function DeleteItem(ListObj,DeleteIndex)
{ ListObj.options[DeleteIndex] = null;}
//将一项从一个例表框移到另一个例表框
function MoveItem(srcListObj,decListObj)
{ if(srcListObj.selectedIndex!=-1)
{ ListValue=srcListObj.options[srcListObj.selectedIndex].value; ListText=srcListObj.options[srcListObj.selectedIndex].text;
DeleteItem(srcListObj,srcListObj.selectedIndex);
for(i=0;i<decListObj.length;i++)
{ if(ListValue==decListObj.options[i].value) return}
InsertItem(decListObj,ListText,ListValue);}
}
//输入校验并生成新用户组权限字符串
function checkinput(FormHandle)
{ if(FormHandle.yhzmc.value=="")
{ alert("用户组名称不能为空!");
FormHandle.yhzmc.focus();
return false; }
var strYhzqx="0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
var beforebit,afterbit
for(i=0;i<FormHandle.selectqx.length;i++)
{ beforebit=strYhzqx.substr(0,FormHandle.selectqx.options[i].value-1);
afterbit=strYhzqx.substr(FormHandle.selectqx.options[i].value,99);
strYhzqx=beforebit+"1"+afterbit; }
if(strYhzqx.length!=100) alert("bit error");
FormHandle.yhzqx.value=strYhzqx;
return true;}
</script>
以上FORM提交后写入数据库就完成了用户组的添加,这里也有用户组编号可能跳号的问题,可以用上面已经描述过的方法加以解决。当对用户组的权限进行编辑时,我们必须将属于当前登陆用户但不属于该用户组的权限显示在一个例表框中,属于该用户组的权限显示在别一个例表框中,用以下语句分别实现:
<select id="allqx" size=10 style='width:150'>
<%sql="SELECT CDMC, QXWS FROM CDB where FCDBH<>0 ORDER BY CDBH"
set Rs1=Conn.execute(sql) %>
<%do while not Rs1.eof
if Mid(Session("YHQX"),Rs1("QXWS"),1)=1 then
if Mid(Rs("YHZQX"),Rs1("QXWS"),1)=0 then
'Rs("YHZQX")就是需要编辑的用户组的权限,在更上面的语句中进行初始化%>
<option value="<%=Rs1("QXWS")%>"><%=Rs1("CDMC")%></option>
<% end if end if Rs1.movenext loop Rs1.close set Rs1=nothing %>
</select>
<select id="selectqx" size=10 style='width:150'>
<%yhzqx=trim(Rs("YHZQX"))
'Rs("YHZQX")就是需要编辑的用户组的权限,在更上面的语句中进行初始化
for i=1 to len(yhzqx)
if(mid(yhzqx,i,1)="1") then
sql="select CDMC from CDB where QXWS="&i
set Rs1=Conn.execute(sql)
if Not Rs1.eof then%>
<option value="<%=i%>"><%=Rs1("CDMC")%></option>
<%end if Rs1.close set Rs1=nothing end if next Rs1.close set Rs1=nothing %>
</select>
其它操作过程与添加时基本一致。
用户的操作过程与用户组的操作过程基本上也是一样的,所用到的代码也大致相同,不过还是有几个要注意的问题:
第一、添加用户时不需要指定用户的权限,只要指定该用户所属的用户组即可,用户权限自动从用户组继承。当然添加完了也可以对用户组的权限进行修改,为了保障安全,修改的范围也只限当前登陆的用户权限范围内。实现如上所述相同。
第二、用户密码的存贮,建议不要存贮为明码,请加密存贮,在本系统中采取了不可逆转的加密算法,即使知道了加密算法与加密后的结果,也不可能还原为原始密码,有利的保障了安全性。
第三、每当在用户组中添加一个用户时用户组表的用户个数就会增加1,当然删除一个用户也会使用该组的用户个数减1。
第四、用户所属的用户组可以修改,修改后用户的权限与新属用户组的权限一样。
4 安全检查
安全检查指登陆的安全检查与访问每个页面时的安全检查两个方面。
登陆时的安全检查指验证用户名与密码,如果验证通过,将该用户的用户权限存贮于会话变量Session("YHQX")中,以利于随时检验。然后引导入主界面,并根据Session("YHQX")生成系统菜单。
我们重点说一下访问每个页面时的安全检查。大家都知道,与C/S程序不同,某个菜单没有显示出来,就并不代表用户没有办法访问该菜单项的功能,因为用户可以通过直接输入URL访问到该功能模块,所以必须在访问每个页面是也要提供一个权限控制机制,防止用户越权使用。我们用如下代码实现了访问页面时的权限检验:
<% ScriptName=Request.ServerVariables("SCRIPT_NAME")
'取得当次请求的URL
for i=len(ScriptName) to 1 step -1
if Mid(ScriptName,i,1)="/" then exit for
next
ScriptName=Mid(ScriptName,i+1,len(ScriptName)-i)
'分离出请求的ASP页面文件名
sql="select 权限位数 from 菜单权限表 where
相关文件 like '%"&ScriptName&"%'"
set Rs1=Conn.execute(sql)
'查找其属于哪一位权限,根据上面所述的相关文件进行查找
if Rs1.eof and Rs1.bof then
response.write "非法访问!"&ScriptName&"还没有进行注册,请通知系统管理员进行注册!"
Rs1.close
set Rs1=nothing
response.end
end if
'比较当前用户的权限,看是否有访问当前页面的权利
Qxbit=Mid(Session("YHQX"),Rs1(0),1)
if Qxbit="" then
response.write "非法访问!"&"<br>权限位数错误,可能是由于您长时间没有操作而超时退出!<br>请重新登陆或联系管理员!"
Rs1.close
set Rs1=nothing
response.end
end if
if Qxbit="0" then
response.write "非法访问!"&"您没有访问此页的权限!"
Rs1.close
set Rs1=nothing
response.end
end if
Rs1.close
set Rs1=nothing
%>
将该文件存为validate.inc
然后在系统中的每个文件的最顶部用如下语句包含进去:
<!--#include file="validate.inc"-->
这样一来,就实现了页面级的权限检查,并且非常方便。甚至,与一些WEB服务器配合,这个执行过程可以自动完成,并不需要在系统的每一个文件顶部包含validate.inc文件,WEB服务器在调用每一个页面前会自动将validate.inc包含到文件顶部。
在需要开发基于用户的安全策略的B/S应用时,首先将以上所述的框架搭建起来,然后再单独开发各个功能模块,然后用提供的菜单管理功能,将功能模块以搭积木的方式添加进来,这样非常方便,也利于团队的协作开发。由于有开放的菜单与统一的权限控制策略,所开发的应用也能够很好的与用户本身所拥有的B/S应用或者其它厂商的B/S应用集成在一起,为用户提供统一的用户操作界面与权限控制体系,这将使产品非常有竟争力。在我们开发的税务系统后台管理系统中,利用此框架,实现了与用户方和第三方厂商应用的集成。
<script language="javascript">
//在一个例表框中插入一项
function InsertItem(ListObj,ListText,ListValue)
{ len=ListObj.length;
ListObj.options[len] = new Option(ListText,ListValue);}
//将例表框中指定的项删除
function DeleteItem(ListObj,DeleteIndex)
{ ListObj.options[DeleteIndex] = null;}
//将一项从一个例表框移到另一个例表框
function MoveItem(srcListObj,decListObj)
{ if(srcListObj.selectedIndex!=-1)
{ ListValue=srcListObj.options[srcListObj.selectedIndex].value; ListText=srcListObj.options[srcListObj.selectedIndex].text;
DeleteItem(srcListObj,srcListObj.selectedIndex);
for(i=0;i<decListObj.length;i++)
{ if(ListValue==decListObj.options[i].value) return}
InsertItem(decListObj,ListText,ListValue);}
}
//输入校验并生成新用户组权限字符串
function checkinput(FormHandle)
{ if(FormHandle.yhzmc.value=="")
{ alert("用户组名称不能为空!");
FormHandle.yhzmc.focus();
return false; }
var strYhzqx="0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
var beforebit,afterbit
for(i=0;i<FormHandle.selectqx.length;i++)
{ beforebit=strYhzqx.substr(0,FormHandle.selectqx.options[i].value-1);
afterbit=strYhzqx.substr(FormHandle.selectqx.options[i].value,99);
strYhzqx=beforebit+"1"+afterbit; }
if(strYhzqx.length!=100) alert("bit error");
FormHandle.yhzqx.value=strYhzqx;
return true;}
</script>
以上FORM提交后写入数据库就完成了用户组的添加,这里也有用户组编号可能跳号的问题,可以用上面已经描述过的方法加以解决。当对用户组的权限进行编辑时,我们必须将属于当前登陆用户但不属于该用户组的权限显示在一个例表框中,属于该用户组的权限显示在别一个例表框中,用以下语句分别实现:
<select id="allqx" size=10 style='width:150'>
<%sql="SELECT CDMC, QXWS FROM CDB where FCDBH<>0 ORDER BY CDBH"
set Rs1=Conn.execute(sql) %>
<%do while not Rs1.eof
if Mid(Session("YHQX"),Rs1("QXWS"),1)=1 then
if Mid(Rs("YHZQX"),Rs1("QXWS"),1)=0 then
'Rs("YHZQX")就是需要编辑的用户组的权限,在更上面的语句中进行初始化%>
<option value="<%=Rs1("QXWS")%>"><%=Rs1("CDMC")%></option>
<% end if end if Rs1.movenext loop Rs1.close set Rs1=nothing %>
</select>
<select id="selectqx" size=10 style='width:150'>
<%yhzqx=trim(Rs("YHZQX"))
'Rs("YHZQX")就是需要编辑的用户组的权限,在更上面的语句中进行初始化
for i=1 to len(yhzqx)
if(mid(yhzqx,i,1)="1") then
sql="select CDMC from CDB where QXWS="&i
set Rs1=Conn.execute(sql)
if Not Rs1.eof then%>
<option value="<%=i%>"><%=Rs1("CDMC")%></option>
<%end if Rs1.close set Rs1=nothing end if next Rs1.close set Rs1=nothing %>
</select>
其它操作过程与添加时基本一致。
用户的操作过程与用户组的操作过程基本上也是一样的,所用到的代码也大致相同,不过还是有几个要注意的问题:
第一、添加用户时不需要指定用户的权限,只要指定该用户所属的用户组即可,用户权限自动从用户组继承。当然添加完了也可以对用户组的权限进行修改,为了保障安全,修改的范围也只限当前登陆的用户权限范围内。实现如上所述相同。
第二、用户密码的存贮,建议不要存贮为明码,请加密存贮,在本系统中采取了不可逆转的加密算法,即使知道了加密算法与加密后的结果,也不可能还原为原始密码,有利的保障了安全性。
第三、每当在用户组中添加一个用户时用户组表的用户个数就会增加1,当然删除一个用户也会使用该组的用户个数减1。
第四、用户所属的用户组可以修改,修改后用户的权限与新属用户组的权限一样。
4 安全检查
安全检查指登陆的安全检查与访问每个页面时的安全检查两个方面。
登陆时的安全检查指验证用户名与密码,如果验证通过,将该用户的用户权限存贮于会话变量Session("YHQX")中,以利于随时检验。然后引导入主界面,并根据Session("YHQX")生成系统菜单。
我们重点说一下访问每个页面时的安全检查。大家都知道,与C/S程序不同,某个菜单没有显示出来,就并不代表用户没有办法访问该菜单项的功能,因为用户可以通过直接输入URL访问到该功能模块,所以必须在访问每个页面是也要提供一个权限控制机制,防止用户越权使用。我们用如下代码实现了访问页面时的权限检验:
<% ScriptName=Request.ServerVariables("SCRIPT_NAME")
'取得当次请求的URL
for i=len(ScriptName) to 1 step -1
if Mid(ScriptName,i,1)="/" then exit for
next
ScriptName=Mid(ScriptName,i+1,len(ScriptName)-i)
'分离出请求的ASP页面文件名
sql="select 权限位数 from 菜单权限表 where
相关文件 like '%"&ScriptName&"%'"
set Rs1=Conn.execute(sql)
'查找其属于哪一位权限,根据上面所述的相关文件进行查找
if Rs1.eof and Rs1.bof then
response.write "非法访问!"&ScriptName&"还没有进行注册,请通知系统管理员进行注册!"
Rs1.close
set Rs1=nothing
response.end
end if
'比较当前用户的权限,看是否有访问当前页面的权利
Qxbit=Mid(Session("YHQX"),Rs1(0),1)
if Qxbit="" then
response.write "非法访问!"&"<br>权限位数错误,可能是由于您长时间没有操作而超时退出!<br>请重新登陆或联系管理员!"
Rs1.close
set Rs1=nothing
response.end
end if
if Qxbit="0" then
response.write "非法访问!"&"您没有访问此页的权限!"
Rs1.close
set Rs1=nothing
response.end
end if
Rs1.close
set Rs1=nothing
%>
将该文件存为validate.inc
然后在系统中的每个文件的最顶部用如下语句包含进去:
<!--#include file="validate.inc"-->
这样一来,就实现了页面级的权限检查,并且非常方便。甚至,与一些WEB服务器配合,这个执行过程可以自动完成,并不需要在系统的每一个文件顶部包含validate.inc文件,WEB服务器在调用每一个页面前会自动将validate.inc包含到文件顶部。
在需要开发基于用户的安全策略的B/S应用时,首先将以上所述的框架搭建起来,然后再单独开发各个功能模块,然后用提供的菜单管理功能,将功能模块以搭积木的方式添加进来,这样非常方便,也利于团队的协作开发。由于有开放的菜单与统一的权限控制策略,所开发的应用也能够很好的与用户本身所拥有的B/S应用或者其它厂商的B/S应用集成在一起,为用户提供统一的用户操作界面与权限控制体系,这将使产品非常有竟争力。在我们开发的税务系统后台管理系统中,利用此框架,实现了与用户方和第三方厂商应用的集成。

















