在网络信息时代,人们对网络信息系统的依赖正逐渐增加,保证网络安全变得愈加重要。网络安全的本质就是需要保证网络上的信息安全,主要包括信息的保密性、完整性、可用性和准确性等。
网站属于计算机网络中的一部分,它用来向用户提供服务及相关信息。因此网络中的安全隐患都会映射到它的身上。如何更有效地保护重要的数据信息,提高网站的安全性已经成为Web程序开发中必须考虑和解决的一个重要问题。
本章将详细介绍在网络开发中的一些安全问题,及针对这些安全问题实施的各种策略和解决方案。读者通过本章的学习,可采用这些技术加强网站的安全,使网站的运行得到可靠的保障。
6.3 用户权限方案
为了提高网站的安全性,经常会为网站中的用户分配不同的权限,这样不仅可以有效的管理用户,而且可以在很大程度上提高网站的安全性。本节将对在开发和运营一个网站时,如何为不同级别的用户分配不同的权限做了具体、全面的分析。
6.3.1 默认用户权限
在一些企业管理系统中,经常会有多位管理人员对系统中的内部资源进行管理。为了提高系统的安全性,大多数情况下,系统中只有一位具有全局权限的管理员,并且该管理员具有添加普通管理员的权限,在添加这些普通管理员时,可以为新的管理员进行权限的分配。
1.方案分析
实例位置:光盘\mr\6\6.3\6.3.1
进入用户登录页面后,首先在登录表单中添加用户的登录信息,然后提交表单,这样该用户的所有登录信息将被提交的用户登录信息处理页。在用户信息处理页中,首先判断用户的用户名和密码是否正确,如果错误则返回登录页面,否则继续判断该用户所属级别,并根据用户级别为其分配不同的权限。例如,人力资源管理系统中的用户可以分为系统用户(或全局用户)、读写用户和只读用户,系统用户具有全局管理的权限,读写用户具有对常规数据进行修改、删除等权限,而只读用户只具有最基本的浏览权限。默认用户权限方案分析的示意图,如图6.16所示。
图6.16 默认用户权限的示意图
2.实施过程
实例位置:光盘\mr\6\6.3\6.3.1
运行网上企业办公自动化系统的用户信息修改页面,如图6.17所示,单击该页面中的用户“权限”下拉列表框,可以发现该系统中用户权限主要分为系统、读写和只读3种。当对用户权限进行修改时首先从用户权限下拉列表中为用户指定权限,然后单击“修改”按钮即可实现用户权限的修改。
图6.17 用户权限修改页面
在网上企业办公自动化系统管理页面中单击“人力资源”超链接,即可进入用户信息管理页面。在该页面中可以添加新用户信息、修改个人信息、修改其他用户信息、删除用户信息等操作。 用户信息添加页面主要用于向数据库中添加新的用户信息。运行结果如图6.18所示。
图6.18 用户信息添加页面
制作添加用户信息的表单页面,该页面主要用于系统用户添加用户信息。在添加用户信息时,将应用JavaScript脚本验证输入信息是否合法。添加用户信息表单页面所涉及的重要表单元素如表6.1所示。
表6.1 添加用户信息页面所涉及的重要表单元素
|
名称 |
元素类型 |
含义 |
重要属性 |
|
form1 |
form |
表单 |
<form ACTION="personnel_add.asp" METHOD="POST" name="form1"> |
|
username |
text |
用户名 |
<input name="username" type="text" class="Sytle_text" id="username"> |
|
branch |
select |
部门 |
<select name="branch" id="select4"> <option value="开发部" selected>开发部</option> <option value="人事部">人事部</option> <option value="销售部">销售部</option> </select> |
|
name |
text |
姓名 |
<input name="name" type="text" class="Sytle_text" id="name"> |
|
sex |
select |
性别 |
<select name="sex" id="sex"> <option value="男" selected>男</option><option value="女">女</option> </select> |
|
purview |
select |
权限 |
<select name="purview" id="select"> <option value="系统" selected>系统</option> <option value="读写">读写</option><option value="只读">只读</option> </select> |
|
Button |
Button |
“提交”按钮 |
<input name="Button" type="button" class="Style_button" value="提交" onClick="Mycheck()"> |
|
Submit2 |
reset |
“重置”按钮 |
<input name="Submit2" type="reset" class="Style_button" value="重置"> |
|
myclose |
button |
“关闭”按钮 |
<input name="myclose" type="button" class="Style_button" id="myclose" value="关闭" onClick="javascrip:window.close()"> |
在实现用户信息添加时,首先判断客户端输入的用户信息是否合法,然后在将合法的用户信息保存到用户信息表中,通过以下代码实现用户信息的添加,代码如下:
例程6-15 代码位置:光盘\mr\6\6.3\6.3.2\personnel_add.asp
<!--#include file="../Connections/conn.asp" -->
<%
if request.Form("username")<>""then
'检测用户名是否存在
Set rs= Server.CreateObject("ADODB.Recordset")
sql="SELECT UserName FROM dbo.Tab_User WHERE UserName='" &Request.Form("UserName")&"'"
rs.open sql,conn,1,3
if rs.eof then
'保存员工信息
username=request.Form("username")
cname=request.Form("name")
branch=request.Form("branch")
PWD=request.Form("PWD")
job=request.Form("job")
tel=request.Form("tel")
purview=request.Form("purview")
sex=request.Form("sex")
email=request.Form("email")
address=request.Form("address")
Ins="Insert into dbo.Tab_User (username,name,branch,PWD,job,tel,purview,sex,"&_
"email,address) values('"&username&"','"&cname&"','"&branch&"','"&PWD&"','"&_
job&"','"&tel&"','"&purview&"','"&sex&"','"&email&"','"&address&"')"
conn.execute(Ins)
%>
<script language="javascript">
alert("员工信息添加成功!");
opener.parent.location.reload();
window.close();
</script>
<%
Else
%>
<script language="javascript">
alert("该员工信息已经存在!");
</script>
<%
end if
end if
%>
<script language="javascript">
function Mycheck()
{
if (form1.username.value=="")
{ alert("请输入员工姓名!");form1.username.focus();return;}
if (form1.PWD.value=="")
{ alert("请输入密码!");form1.PWD.focus();return;}
if (form1.tel.value=="")
{
alert("请输入员工的联系电话!");
form1.tel.focus();return;
}
if(form1.email.value!="" && (form1.email.value.indexOf('@',0)==-1|| form1.email.value.indexOf('.',0)==-1))
{alert("您输入的E-mail地址不对!");form1.email.focus();return;}
if (form1.address.value=="")
{
alert("请输入员工的住址!");
form1.address.focus();return;
}
form1.submit();}
</script>
用户成功登录后,首先判断此用户是否是系统用户,如果该用户是系统用户,则可以通过“人力资源管理”模块,进行“添加新用户”、“修改个人信息”、“用户信息修改”和“用户信息删除”操作(可以对所有用户进行修改和删除操作);否则只可以对用户本身的密码进行修改。用户信息修改页面的运行结果如图6.19所示。
图6.19 用户信息修改页面
通过以下代码实现用户信息的修改,代码如下:
例程6-16 代码位置:光盘\mr\6\6.3\6.3.2\personnel_modify.asp
<!--#include file="../Connections/conn.asp" -->
<%
'查询员工信息
If Request.QueryString("ID")<>""then
session("ID")=Request.QueryString("ID")
end if
Set rs_personnel = Server.CreateObject("ADODB.Recordset")
sql_P="SELECT ID,UserName,name,PWD,purview,branch,job,sex,Email,Tel,Address"&_
" FROM dbo.Tab_User WHERE ID="&session("ID")&""
rs_personnel.open sql_p,conn,1,3
%>
<%
'修改员工信息
if request.Form("Name")<>"" then
cname=request.Form("name")
PWD=request.Form("PWD")
purview=request.Form("purview")
sex=request.Form("sex")
tel=request.Form("tel")
branch=request.Form("branch")
job=request.Form("job")
email=request.Form("email")
address=request.Form("address")
UP="Update dbo.Tab_User set name='"&cname&"',PWD='"&PWD&"',purview='"&_
purview&"',sex='"&sex&"',tel='"&tel&"',branch='"&branch&"',job='"&job&_
"',email='"&email&"',address='"&address&"' where ID='"&session("ID")&"'"
conn.execute(UP)
%>
<script language="javascript">
alert("数据修改成功!");
opener.parent.location.reload();
window.close();
</script>
<%
end if
%>
<script language="javascript">
function Mycheck()
{
if (form1.name.value=="")
{ alert("请输入员工姓名!");form1.name.focus();return;}
if (form1.PWD.value=="")
{ alert("请输入密码!");form1.PWD.focus();return;}
if (form1.tel.value=="")
{
alert("请输入员工的联系电话!");
form1.tel.focus();return;
}
if(form1.email.value!="" && (form1.email.value.indexOf('@',0)==-1|| form1.email.value.indexOf('.',0)==-1))
{
alert("您输入的E-mail地址不对!");
form1.email.focus();return;
}
if (form1.address.value=="")
{
alert("请输入员工的住址!");
form1.address.focus();return;
}
form1.submit();}
</script>
通过以下代码实现用户信息的删除,代码如下:
例程6-17 代码位置:光盘\mr\6\6.3\6.3.2\personnel_del.asp
<!--#include file="../Connections/conn.asp" -->
<%
if request.Form("UserName")<>"" then
DEL="Delete From dbo.Tab_User where ID='"&session("ID")&"'"
conn.execute(Del)
%>
<script language="javascript">
alert("员工信息已经删除!");
opener.location.reload();
window.close();
</script>
<%end if%>
<%
if Request.QueryString("ID")<>""then
session("ID")=Request.QueryString("ID")
end if
Set rs_personnel = Server.CreateObject("ADODB.Recordset")
sql_P="SELECT ID,UserName,Name,PWD,purview,branch,sex,Email,Tel,Address"&_
" FROM dbo.Tab_User WHERE ID="&session("ID")&""
rs_personnel.open sql_P,conn,1,3
%>
3.补充说明
为用户分配默认的权限,即可在添加用户信息时指定,也可以先注册用户信息,然后根据不同用户的职能为其分配不同的权限。为了提高网站的安全性,在为用户指定默认权限时,一定要根据用户的职能权限进行的合理分配,否则一旦非法用户登录系统将会给整个系统造成极大的损失。
6.3.2 简单自定义用户权限
简单自定义权限是指在添加新管理员时,根据该管理员的管理职责而为其分配的权限。例如,在为系统添加数据录入管理人员时,只需为其分配数据添加和数据删除的权限即可,为了提高整个系统的安全性,不必为其过多的分配其他权限。下面将以办公自化管理系统为例来讲解简单自定义用户权限的具体实现过程。
1.方案分析
一个网站管理系统的后台用户主要分为两种,一种是全局管理员,另一种是普通管理员。全局管理员具有整个后台的全局管理权限,除了具有对后台数据进行管理的所有权限外,还具有对普通管理员进行管理的权限;而普通管理员只具有对后台数据进行添加、修改和删除的权限以及对个人信息进行修改的权限。管理人员首先进入后台登录页面,然后在登录表单中输入个人的登录信息并提交表单,这样该管理员的登录信息将被提交到用户信息验证页,如果用户的个人信息填写错误则返回到登录页,否则对用户的级别进行判断,并根据用户的级别为其分配不同的权限。实现简单自定义用户权限的示意图,如图6.20所示。
图6.20 简单自定义用户权限的示意图
2.实施过程
实例位置:光盘\mr\6\6.3\6.3.2
下面将以办公自动化管理系统为例讲解如何实现简单自定义用户权限。当超级用户成功进入系统后,可以进行新用户的添加,如图6.21所示。首先在该页面的用户名和密码的文本框中输入合法的用户名和密码,然后从权限列表框中选择要为该用户分配的权限,最后单击“提交”按钮即可实现自定义权限的添加。

图6.21 添加超级用户信息页面
通过以下代码实现数据库的连接,代码如下:
例程6-18 代码位置:光盘\mr\6\6.3\6.3.2\data\conn.asp
<%
set conn=server.CreateObject("Adodb.Connection")
Path="driver={SQL Server};server=.;uid=sa;pwd=;database=db_safe"
conn.open path
function HTMLcode(fString)
if not isnull(fString) then
fString = Replace(fString, CHR(13), "")
fString = Replace(fString, CHR(10) & CHR(10), "</P><P>")
fString = Replace(fString, CHR(10), "<BR>")
fString = Replace(fString, CHR(32), " ")
HTMLcode = fString
end if
end function
%>
在用户管理模块中单击“用户添加”超链接,即可进入到用户添加页面。用户信息添加页面主要用于向数据库中添加新的用户信息。其运行结果如图6.22所示。
图6.22 用户信息添加页面的运行结果
制作添加用户信息的表单页面,该页面主要用于收集超级用户添加的用户信息和验证输入信息是否合法。添加用户信息表单页面所涉及的重要表单元素如表6.2所示。
表6.2 添加用户信息页面所涉及的重要表单元素
|
名称 |
元素类型 |
含义 |
重要属性 |
|
form1 |
form |
表单 |
action="" method="post" name="form1" |
|
username |
text |
用户名 |
<input name="username" type="text" id="username" size="20"> |
|
post |
hidden |
隐藏域 |
<input name="post" type="hidden" id="post" value="1"> |
|
userpwd |
password |
密码 |
<input name="userpwd" type="password" id="userpwd" size="20"> |
|
menu1 |
select |
文本域 |
<select name="menu1" size="3" onChange="MM_jumpMenu('nei',this,0)"> <% set rs2=server.CreateObject("adodb.recordset") sql2="select * from renshi" rs2.open sql2,conn,1,1 if not rs2.eof then for i=1 to rs2.recordcount and not rs2.eof%> <option value=nei.asp?id=<%=rs2("id")%>> <%=rs2("name")%></option> <% rs2.movenext if rs2.eof then exit for Next else response.Write("<option value='没有用户'>没有用户</option>") end if %></select> |
|
Submit |
Submit |
“提交”按钮 |
<input type="submit" name="Submit" value="提交"> |
|
Submit2 |
reset |
“重置”按钮 |
<input type="reset" name="Submit2" value="重置"> |
在实现用户信息添加时,首先判断客户端输入的用户信息是否合法,然后在将合法的用户信息保存到用户信息表中,通过以下代码实现用户信息的添加,代码如下:
例程6-19 代码位置:光盘\mr\6\6.3\6.3.2\adduser.asp
<!--#include file=data/conn.asp-->
<!--#include file=connfig.asp-->
<!--#include file=inc/yan.asp-->
<%
'验证用户身份
call case10
if request("post")=1 then
if request("username")="" or request("userpwd")="" then
response.Write("<script language=JavaScript>" & "alert('用户名或者密码不能为空!');" & "history.back()" & "</script>")
else
if request("user")=0 then
call wr1
else
call wr2
end if
end if
end if
'添加普通用户
function wr1
username=trim(replace(request("username"),"'",""))
userpwd=trim(replace(request("userpwd"),"'",""))
for i=1 to len(username)
user=mid(username,i,1)
if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then
response.write "<script language=JavaScript>" & "alert('您的用户名含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
for i=1 to len(userpwd)
pass=mid(userpwd,i,1)
if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then
response.write "<script language=JavaScript>" & "alert('您的密码含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
'判断用户名是否已经存在
set rs1=server.CreateObject("adodb.recordset")
sql1 = "Select * From users Where username='"&request("username")&"'"
rs1.open sql1,conn,1,1
If not rs1.EOF Then
response.Write("<script language=JavaScript>" & "alert('用户名已经存在!');" & "window.location.href='adduser.asp';" & "</script>")
response.End()
end if
rs1.close
'添加用户权限
set rs=server.CreateObject("adodb.recordset")
sql="select * from users"
rs.open sql,conn,1,3
rs.addnew
rs("username")=request("username")
rs("userpwd")=request("userpwd")
rs("shenhe")=request("shenhe")
rs("huiyi")=request("huiyi")
rs("gonggong")=request("gonggong")
rs("geren")=request("geren")
rs("renshi")=request("renshi")
rs("name")=session("na")
rs("time")=now()
rs.update
rs.close
response.Write("<script language=JavaScript>" & "alert('添加成功!');" & "window.location.href='adduser.asp';" & "</script>")
response.End()
end function
'添加超级用户
function wr2
username=trim(replace(request("username"),"'",""))
userpwd=trim(replace(request("userpwd"),"'",""))
for i=1 to len(username)
user=mid(username,i,1)
if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then
response.write "<script language=JavaScript>" & "alert('您的用户名含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
for i=1 to len(userpwd)
pass=mid(userpwd,i,1)
if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then
response.write "<script language=JavaScript>" & "alert('您的密码含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
set rs1=server.CreateObject("adodb.recordset")
sql1 = "Select * From users Where username='"&request("username")&"'"
rs1.open sql1,conn,1,1
If not rs1.EOF Then
response.Write("<script language=JavaScript>" & "alert('用户名已经存在!');" & "history.back()" & "</script>")
end if
rs1.close
set rs=server.CreateObject("adodb.recordset")
sql="select * from users"
rs.open sql,conn,1,3
rs.addnew
rs("username")=request("username")
rs("userpwd")=request("userpwd")
rs("name")=session("na")
rs("chaoji")=1
rs("time")=now()
rs.update
rs.close
response.Write("<script language=JavaScript>" & "alert('添加成功!');" & "history.back()" & "</script>")
end function
%>
在进行用户登录时,首先判断此用户是否是超级用户,如果该用户是超级用户,则可以通过“用户管理”模块,进行“用户添加”、“用户修改”和“删除”操作(可以对所有用户进行修改和删除操作);否则只可以对用户本身的密码进行修改。用户信息修改页面的运行结果如图6.23所示。
图6.23 用户信息修改页面的运行结果
通过以下代码实现用户信息的修改,代码如下:
例程6-20 代码位置:光盘\mr\6\6.3\6.3.2\adduser1.asp
<!--#include file=data/conn.asp-->
<!--#include file=connfig.asp-->
<!--#include file=inc/yan.asp-->
<%
call case10
set rs2=server.CreateObject("adodb.recordset")
sql2="select * from users where id="&request("id")
rs2.open sql2,conn,1,1
if request("post")=1 then
if request("username")="" or request("userpwd")="" then
response.Write("<script language=JavaScript>" & "alert('用户名或者密码不能为空!');" & "history.back()" & "</script>")
else
if request("user")=0 then
call wr1
else
call wr2
end if
end if
end if
function wr1
if session("na")="" then
na=rs2("name")
else
na=session("na")
end if
username=trim(replace(request("username"),"'",""))
userpwd=trim(replace(request("userpwd"),"'",""))
for i=1 to len(username)
user=mid(username,i,1)
if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then
response.write "<script language=JavaScript>" & "alert('您的用户名含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
for i=1 to len(userpwd)
pass=mid(userpwd,i,1)
if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then
response.write "<script language=JavaScript>" & "alert('您的密码含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
set rs=server.CreateObject("adodb.recordset")
sql="select * from users where id="&session("id")
rs.open sql,conn,1,3
rs("username")=request("username")
rs("userpwd")=request("userpwd")
rs("shenhe")=request("shenhe")
rs("huiyi")=request("huiyi")
rs("gonggong")=request("gonggong")
rs("geren")=request("geren")
rs("renshi")=request("renshi")
rs("name")=na
rs("chaoji")=0
rs.update
rs.close
response.Write("<script language=JavaScript>" & "alert('修改成功!');" & "history.back()" & "</script>")
end function
function wr2
if session("na")="" then
na=rs2("name")
else
na=session("na")
end if
username=trim(replace(request("username"),"'",""))
userpwd=trim(replace(request("userpwd"),"'",""))
for i=1 to len(username)
user=mid(username,i,1)
if user="'" or user="%" or user="<" or user=">" or user="&" or user="|" then
response.write "<script language=JavaScript>" & "alert('您的用户名含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
for i=1 to len(userpwd)
pass=mid(userpwd,i,1)
if pass="'" or pass="%" or pass="<" or pass=">" or pass="&" or pass="|" then
response.write "<script language=JavaScript>" & "alert('您的密码含有非法字符,请重新输入!');" & "history.back()" & "</script>"
response.end
end if
next
set rs=server.CreateObject("adodb.recordset")
sql="select * from users where id="&session("id")
rs.open sql,conn,1,3
rs("username")=request("username")
rs("userpwd")=request("userpwd")
rs("name")=na
rs("chaoji")=1
rs.update
rs.close
response.Write("<script language=JavaScript>" & "alert('修改成功!');" & "history.back()" & "</script>")
end function
%>
通过以下代码实现用户信息的删除,代码如下:
例程6-21 代码位置:光盘\mr\6\6.3\6.3.2\del.asp
<!--#include file=data/conn.asp-->
<!--#include file=connfig.asp-->
<!--#include file=inc/yan.asp-->
<%
'验证用户权限
call case10
if request("del")<>"" and ps("chaoji")=1 then
call del
end if
'删除用户
function del
sql2="delete from users where id="&request("del")
conn.Execute(sql2)
end function
%>
当登录的用户是普通用户时,只可以对用户本身的密码进行修改。通过以下代码实现普通用户密码的修改操作,代码如下:
例程6-22 代码位置:光盘\mr\6\6.3\6.3.2\yonghugai.asp
<!--#include file=data/conn.asp-->
<!--#include file=connfig.asp-->
<%
if request("post")<>"" then
call write1
end if
function write1
if request("userpwd1")<>"" and request("userpwd2")<>"" then
if request("userpwd1")<>request("userpwd2") then
response.Write("<script language=javascript>alert('两次输入密码不一致!!')</script>")
else
set rs=server.CreateObject("adodb.recordset")
sql="select * from users where username='"&session("admin_name")&"'"
rs.open sql,conn,1,3
rs("userpwd")=request("userpwd1")
rs.update
end if
else
response.Write("<script language=javascript>alert('密码不能为空!')</script>")
end if
if request("qq")<>"" then
set rs1=server.CreateObject("adodb.recordset")
sql1="select * from renshi where name='"&rs("name")&"'"
rs1.open sql1,conn,1,3
rs1("tel")=request("tel")
rs1("age")=request("age")
rs1("email")=request("email")
rs1("address")=request("address")
rs1.update
rs1.close
end if
response.Redirect("chenggong.htm")
end function
set rs3=server.CreateObject("adodb.recordset")
sql3="select * from users where username='"&session("admin_name")&"'"
rs3.open sql3,conn,1,3
set rs4=server.CreateObject("adodb.recordset")
sql4="select * from renshi where name='"&rs3("name")&"'"
rs4.open sql4,conn,1,3
%>
3.补充说明
在实现简单自定义用户权限时,也可以将普通用户权限和超级用户权限的选项放在下拉列表中,并在Dreamweaver中插入两个下拉列表框,同时将下拉列表的类型设置为“列表”类型,选择“允许多选”前面的复选框,设置完成后将相关的权限信息输入到下拉列表框中,此时可以按shift键进行用户权限的多选操作,即实现与复选框同样的功能。通过该方法同样可以实现简单自定义用户权限的设置,运行结果如图6.24所示。

图6.24 应用下拉列表实现简单自定义用户权限的设置
6.3.3 复杂自定义用户权限
在某些较大规模的管理系统中,为了有效合理的对系统信息进行管理,无论是全局管理员还是普通管理者的权限都是极其复杂的。那么如何在复杂的管理系统中定义及分配用户的权限呢?下面将以企业进销存管理系统为例来讲解复杂自定义用户权限的设计方案及具体实现过程。
1.方案分析
实现“复杂自定义用户权限”与实现“简单自定义用户权限”的实现方案大体类似,区别是在为用户指定权限时需要考虑更多的因素。管理人员首先进入后台登录页面,然后在登录表单中输入个人的登录信息并提交表单,这样该管理员的登录信息将被提交到用户信息验证页,如果用户的个人信息填写错误则返回到登录页,否则可以对用户的级别进行判断,并根据用户的级别为其分配不同的权限。实现复杂自定义用户权限的示意图,如图6.25所示
图6.25 复杂自定义用户权限的示意图
2.实施过程
实例位置:光盘\mr\6\6.3\6.3.3
全局管理员成功登录企业进销存管理系统的后台时,就可以进入该系统的“权限管理”模块,如图6.26所示。在“权限管理”模块中列出了所有管理员的用户名和该管理员的权限信息,如果预删除某管理员,可以直接单击该管理员所对应的“删除”超链接即可。如果对某用户的权限进行设置或重新分配时,可以单击该管理员后的“权限设置”超链接进入权限设置页面可以对该管理员的权限进行重新设定。

图6.26 复杂自定义用户权限管理页面
本系统后台数据库采用的是Access数据库,系统数据库名称为db_database.mdb。数据库db_database.mdb中包含两张数据表:分别为tb_use(管理员信息表)和tb_purview(权限信息表)。下面将分别给出这两个数据表的表结构。
(1)tb_use(管理员信息表)主要用于保存管理员的名称及密码信息,其表结构如表6.3所示。
表6.3 表tb_use的结构
|
字段名称 |
数据类型 |
长度 |
默认值 |
描述 |
|
id |
自动编号 |
管理员ID号 |
||
|
use |
文本 |
50 |
管理员名称 |
|
|
pwd |
文本 |
50 |
管理员密码 |
(2)tb_purview(权限信息表)主要用于保存管理员的权限信息,其表结构如表6.4所示。
表6.4 tb_purview表
|
字段名称 |
数据类型 |
长度 |
默认值 |
描述 |
|
id |
数字 |
长整型 |
0 |
管理员ID号 |
|
purviewSet |
是/否 |
权限设置 |
||
|
basicSet |
是/否 |
基本信息管理 |
||
|
stockSet |
是/否 |
进货管理 |
||
|
sellSet |
是/否 |
销售管理 |
||
|
storageSet |
是/否 |
库存管理 |
||
|
querySet |
是/否 |
查询统计 |
||
|
reportSet |
是/否 |
报表管理 |
通过以下代码实现数据库的连接,代码如下:
例程6-23 代码位置:光盘\mr\6\6.3\6.3.3\Conn\conn.asp
<%
Set conn=Server.CreateObject("ADODB.Connection")
sql="Provider=Microsoft.jet.oledb.4.0;data source="&Server.MapPath("database/db_database.mdb")
conn.open(sql)
%>
在权限管理的主页中单击“添加管理员信息”超链接,即可进入到添加管理员信息页面。添加管理员信息页面主要用于向数据库中添加新的管理员。运行结果如图6.27所示。

图6.27 添加管理员信息页面的运行结果
制作添加管理员信息的表单页面,该页面主要用于收集管理员添加的管理员信息和验证输入信息是否合法。添加管理员信息表单页面所涉及的重要表单元素如表6.5所示。
表6.5 添加管理员信息页面所涉及的重要表单元素
|
名称 |
元素类型 |
含义 |
重要属性 |
|
form1 |
form |
表单 |
action="tjyg.asp" method="post" name="form1" |
|
use |
text |
管理员名称 |
<input name="use" type="text" id="use" size="19"> |
|
pwd |
password |
管理员密码 |
<input name="pwd" type="password" id="pwd" size="20"> |
|
pwd1 |
password |
确认密码 |
<input name="pwd1" type="password" id="pwd1" size="20"> |
|
Img1 |
Img |
“保存”按钮 |
<img src="images/button2.gif" width="58" height="24" onClick="Mycheck1();"> |
|
Img2 |
img |
“关闭”按钮 |
<img src="images/button3.gif" width="58" height="24" onClick="window.close();opener.location.reload();"> |
在实现管理员信息添加时,首先判断客户端输入的管理员信息是否合法,然后在将合法的管理员信息保存到管理员信息表中,并同时级联插入权限信息,级联插入权限信息主要通过获取Access数据库中插入记录的自动编号实现的。代码如下:
例程6-24 代码位置:光盘\mr\6\6.3\6.3.3\tjyg.asp
<!--#include file="conn/conn.asp"-->
<%
function filter_Str(InString)
'***********************************
'功能:过滤输入字符串中的危险符号
'调用方法:filter_Str("String")
'***********************************
NewStr=Replace(InString,"'","''")
NewStr=Replace(NewStr,"<","<")
NewStr=Replace(NewStr,">",">")
NewStr=Replace(NewStr,"chr(60)","<")
NewStr=Replace(NewStr,"chr(37)",">")
NewStr=Replace(NewStr,"""",""")
NewStr=Replace(NewStr,";",";;")
NewStr=Replace(NewStr,"--","-")
NewStr=Replace(NewStr,"/*"," ")
NewStr=Replace(NewStr,"%"," ")
filter_Str=NewStr
end function
if request.Form("use")<>"" then
use=filter_Str(request.Form("use"))
pwd=filter_Str(request.Form("pwd"))
'检测输入的管理员是否已存在
set rs=server.CreateObject("Adodb.recordset")
sql="select * from tb_use where use='"&use&"'"
rs.open sql,conn,1,3
if rs.eof and rs.bof then
'通过下面的程序代码来保存用户注册信息
rs.addnew()
rs("use")=use
rs("pwd")=pwd
rs.update
'获取Access数据库中插入记录的自动编号
temp=rs.bookmark
rs.bookmark=temp
id=rs("id")
ins1="insert into tb_purview(id,purviewSet,basicSet,stockSet,sellSet,storageSet,querySet,reportSet)values("&id&","&false&","&false&","&false&","&false&","&false&","&false&","&false&")"
conn.execute(ins1)
%>
<script language="javascript">
alert("管理员信息添加成功,继续添加!");
window.location='tjyg.asp';
</script>
<%
Else
%>
<script language="javascript">
alert("该管理员信息已存在!");
window.location='tjyg.asp';
</script>
<%
end if
end if
%>
显示管理员列表页面即权限管理的主页面,在该页面中将显示所有管理员信息,其中管理员的权限是以复选框的形式进行显示,页面运行结果如图6.26所示,代码如下:
例程6-25 代码位置:光盘\mr\6\6.3\6.3.3\main.asp
<%
Set rs=Server.CreateObject("Adodb.RecordSet")
sql="select * from tb_use u inner join tb_purview p on u.id=p.id order by u.id asc"
rs.open sql,conn,1,3
if rs.bof and rs.eof then
response.Write("暂无管理员信息!")
else
%>
<table width="696" height="67" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#6598CD">
<tr>
<td height="25" bgcolor="#99CDFF">
<div align="center" class="STYLE6">管理员名称</div>
</td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">权限管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">基础信息管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">进货管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">销售管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">库存管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">查询统计</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">报表管理</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">权限设置</div></td>
<td bgcolor="#99CDFF"><div align="center" class="STYLE6">操作</div></td>
</tr>
<%
for i=1 to rs.recordcount
%>
<tr>
<td height="20" bgcolor="#FFFFFF">
<div align="center" class="STYLE6"><%=rs("use")%></div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled"
<%if rs("purviewSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("basicSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("stockSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("sellSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("storageSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("querySet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF">
<div align="center" class="STYLE6">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled" <%if rs("reportSet") then response.write("checked") end if%>>
</div>
</td>
<td bgcolor="#FFFFFF"><div align="center"><span class="STYLE6">
<%
if rs1("purviewSet")=true and rs("use")<>"mr" then
%>
<a href="#" onClick="window.open('qx.asp?id=<%=rs("u.id")%>','','width=292,height=175')"><span class="STYLE9">权限设置</span></a>
<%else%>
<span class="STYLE9"> </span>
<%end if%>
</td>
<td bgcolor="#FFFFFF">
<div align="center">
<%if rs1("purviewSet")=true and rs("use")<>"mr" then%>
<a href="del.asp?id=<%=rs("u.id")%>"><span class="STYLE9">删除</span></a>
<%
Else
%>
<span class="STYLE9"> </span>
<%
end if
%>
</div>
</td>
</tr>
<%
rs.movenext
if rs.eof then exit for
next
%>
</table>
<%
end if
%>
管理员在进行登录时,首先判断此管理员是否拥有权限管理的功能,如果有权限管理功能,则可以通过单击某条管理员信息右侧的“权限设置”超链接即可进入到管理员权限修改页面,在该页面中将显示该管理员的权限信息,设置相应的信息后,单击“保存”按钮即可将管理员的权限信息保存到数据表中;否则将不显示“权限设置”超链接。管理员权限修改页面的运行结果如图6.28所示。

图6.28 管理员权限修改页面的运行结果
通过以下代码实现管理员权限的修改,代码如下:
例程6-26 代码位置:光盘\mr\6\6.3\6.3.3\ok.asp
<!--#include file="conn/conn.asp"-->
<%
if request.Form("Button")="保存" then
purviewSet=request.Form("purviewSet")
if purviewSet="" then purviewSet=false
basicSet=request.Form("basicSet")
if basicSet="" then basicSet=false
stockSet=request.Form("stockSet")
if stockSet="" then stockSet=false
sellSet=request.Form("sellSet")
if sellSet="" then sellSet=false
storageSet=request.Form("storageSet")
if storageSet="" then storageSet=false
querySet=request.Form("querySet")
if querySet="" then querySet=false
reportSet=request.Form("reportSet")
if reportSet="" then reportSet=false
UP="Update tb_purview set purviewSet="&purviewSet&",basicSet="&basicSet&",stockSet="&stockSet&",sellSet="&sellSet&",storageSet="&storageSet&",querySet="&querySet&",reportSet="&reportSet&" where ID="&session("ID")&""
conn.execute(UP)
end if
%>
通过以下代码实现管理员信息的删除,代码如下:
例程6-27 代码位置:光盘\mr\6\6.3\6.3.3\del.asp
<!--#include file="conn/conn.asp"-->
<%
if request.QueryString("id")<>"" then
Del="Delete from tb_use where ID="&request.QueryString("id")&""
conn.execute(Del)
%>
<script language="javascript">
window.location.href='main.asp';
</script>
<%
end if
%>
3.补充说明
在本方案中实现管理员信息添加时,首先需要将管理员信息添加到管理员信息数据表中,然后需要在权限信息表中也同时级联插入该管理员的权限信息,实现级联插入管理员权限信息主要通过获取Access数据库中插入记录的自动编号实现的。下面对该技术进行详细介绍。
本方案主要通过Bookmark属性使用户对Recordset中的记录进行标记,稍后再返回给它。使用Bookmark属性可以保存当前记录的位置并随时返回该记录。Bookmark属性只能在支持书签功能的Recordset对象中使用。
打开Recordset对象时,其每个记录都有唯一的书签。要保存当前记录的书签,请将Bookmark 属性的值赋给一个变量。移动到其他记录后要快速返回到该记录时,请将该Recordset对象的 Bookmark属性设置为该变量的值。
如果使用Clone方法创建Recordset对象的一个副本,则原始的和复制的Recordset对象Bookmark属性设置相同并可以替换使用。但是无法替换使用不同Recordset对象的书签,即使这些书签是通过同一数据源或命令创建的。
在客户端上使用Recordset对象时,Bookmark属性始终有效。例如以下代码:
temp=rs.bookmark
rs.bookmark=temp
为了使读者能够更好地理解和运用该技术,下面将给出一个具体的应用方案。在开发留言板程序时,应设置回复功能。本方案主要通过Recordset对象中的Bookmark属性使用户对Recordset 中的记录进行标记,稍后再返回给它。当对留言信息进行回复时,回复的信息将直接与留言信息依依相对应,就无须在指定回复留言的ID号。运行结果如图6.29所示。

图6.29 向Access数据库中插入记录
通过以下代码实现数据库的连接,代码如下:
<%
set conn=server.CreateObject("adodb.connection")
sql="Driver={Microsoft Access Driver (*.mdb)};DBQ=" &server.MapPath("Database/db_database.mdb")
conn.open(sql)
%>
添加表单、文本框和文本域,并设置其相关的属性值,代码如下:
<form method="post" name="form1">
<input name="title" type="text" class="text" id="title" size="32">
<textarea name="content" cols="30" rows="8" class="text" id="content">
</textarea>
<input name="Submit" type="submit" class="button" value="提交">
<input name="Submit2" type="reset" class="button" value="重置">
</form>
通过以下代码实现立即获取插入记录的自动编号,代码如下:
<%
if request.form("title")<>"" then
title=request.form("title")
content=request.form("content")
Set rs=Server.CreateObject("ADODB.Recordset")
sql="select * from tb_sml"
rs.open sql,conn,1,3
rs.addnew()
rs("title")=title
rs("content")=content
rs.update()
temp=rs.bookmark
rs.bookmark=temp
topicID=rs("ID")
ins="insert into tb_back (title_ID) values ("&topicID&")"
conn.execute(ins)
end if
%>
