安全|策略 2 菜單管理
菜單管理主要包括兩部分的內容,功能表項目的編輯維護與根據當前登陸使用者的許可權進行菜單的產生。
菜單的編輯維護就是指對菜單表的維護。因為比較簡單,在此不做詳細說明,只是要注意以下三個問題:
第一、菜單編號與許可權位元的產生。因為功能表項目是可以刪除的,如果新增功能表項目擷取編號與許可權位元時只是在最大的編號上增1的話,必須會導致編碼資源的浪費,特別是許可權位元,只有100位,如果由於跳號而導致了編碼資源的浪費,必然導致新功能模組無編碼資源可用。所以,在添加新功能表項目是必須要解決跳號的問題。請看以下取編號與許可權位元的語句:
select min(CDBH)+1 from CDB where CDBH+1 not in(select CDBH from CDB)
select min(QXWS)+1 from CDB where QXWS+1 not in(select QXWS from CDB)
我們只要保證對於菜單維護本身的這個功能模組給它分配菜單編號為1,許可權位元為1的話,就能夠保證在任何情況下新增功能表項目時菜單編號與許可權位元不會跳號,編碼資源能夠得到充分利用。因為菜單維護本身這個功能表項目在通常情況下是不會被刪除的。
第二、入口路徑是指進入本功能模組的第一個頁面的串連地址,請注意路徑的相對性問題。
第三、相關檔案是指完成本功能模組的頁面組合。一般情況下,一個功能表項目下串連一個功能模組,要完成該功能模組的功能可能需要若干個ASP頁面。例如,功能表項目1的入口路徑是../menu1.asp,還要以下三個頁面,menu11.asp, menu12.asp, menu13.asp,則相關檔案的內容是指meunu1.asp, menu11.asp,menu12.asp,menu13.asp這個字串序例。該項的主要作用是為了安全檢查而設定的,也就是頁面在系統中的註冊過程。
根據當前登陸使用者的許可權進行菜單產生時有一個關鍵的會話變數:Session("YHQX"),該變數在後面將要進行描述的安全檢查過程中產生,一直儲存到使用者退出系統或者會話逾時失效時為止。裡面的內容就是100位的當前登陸使用者的許可權字串。根據該變數產生菜單的過程如下:
<% sql="select * from CDB where FCDBH=0 order by CDBH"
set Rs=Conn.execute(sql)
'取得菜單表中的所有有子功能表的父菜單
'遍曆父菜單
do while not Rs.eof
SubMenuNum=0
sql="select QXWS from CDB where FCDBH="&Rs("CDBH")&" order by CDBH"
set Rs1=Conn.execute(sql)
'擷取當前父菜單下的所有子功能表
'遍曆當前父菜單下的子功能表
do while not Rs1.eof
if Mid(Session("YHQX"),Rs1("QXWS"),1)=1 then
SubMenuNum=SubMenuNum+1
'如果目前使用者有當前子功能表的許可權,則子功能表的個數加上1
end if
Rs1.movenext
loop
Rs1.close
set Rs1=nothing
if SubMenuNum>0 then
'如果目前使用者的當前父菜單的下子功能表個數大於零則產生該父菜單
if Rs.bof then FirstMenu=Rs("CDBH") end if
MenuNum=Rs("CDBH")
ParentName=Rs("CDMC")
response.write "<!-- "&ParentName&"父菜單 -->"
%>
<menu class=parent name=<%=ParentName%> url=<%=Rs("RKLJ")%> target= mainFrame >
'菜單的形式與樣式根據需要自己調整,這裡採用泛指方式
<%
response.write "<!-- "&ParentName&"子功能表 -->"
sql="select * from CDB where FCDBH="&MenuNum&" order by CDBH"
set Rs1=Conn.execute(sql)
'尋找該父菜單下的所有子功能表
do while not Rs1.eof
if Mid(Session("YHQX"),Rs1("YHQX"),1)=1 then
%>
<menu class=child name=<%=Rs("CDMC")%> url=<%=Rs("RKLJ")%> target= mainFrame ><br>
'菜單的形式與樣式根據需要自己調整,這裡採用泛指方式
<%
end if
Rs1.movenext
loop
Rs1.close
set Rs1=nothing
end if
Rs.movenext
loop
Rs.close
set Rs=nothing
%>
由於本系統只有兩級菜單,所以沒有牽涉到菜單遞迴調用產生的問題。如果要實現的話必須把菜單產生流程定義成函數形式,才能進行遞迴調用,在此不做詳細討論。
3 許可權分配
許可權的分配由使用者組許可權分配與使用者的許可權分配兩部分組成。是將具體的菜單與使用者組或者使用者關聯的過程。
首先看使用者組的添加介面如下:
<form name="zjyhz" method="post" action="yhzbmb_zj.asp" onsubmit="return checkinput(this)"> <!-- 調用輸入檢驗函數,並產生許可權字串-->
<input type="hidden" name="action" value="zjyhz">
<table cellpadding="0" cellspacing="0" width="100%">
<tr>
<td><fieldset align="center"><legend>增加使用者組
</legend>
<input type="hidden" name="DQDWDM" value="<%=DQDWDM%>"><!--由前一頁傳入,當前單位編碼-->
使用者組名稱:<input type="text" name="yhzmc" size="50" maxlength="50" ><br><br>
設定使用者組許可權:<br>
<table width="100%" border="0" cellpadding="0" cellspac