标志 名称 A 人事管理 AA 查看个人档案 AB 修改档案 在这个账号的权限字段里写上:AA-AB 就表示这个人可以查看"个人档案"及"修改档案"。类似这样的。 另外,可将权限字段用SESSION存起来,每个页面再用代码分析,正如sdliubo(Fuck Japanese!)所说的。很想听听更好的方法。up
<?php//////供每个页面掉用的函数///($ulogin->登录用户的ID号;$operationid->各页面及按扭的ID号)////////// ///////好比判断一个按扭该用户有没有则可以if(Pright($ulogin,$oterationid)){echo "<input type=button>";}其中$ulogin用户登进来session记录的用户的userid,而$oterationid整个功能表里的该按扭功能的ID因为要分功能则必有所有功能的功能表,且这个表是系统一开始就有初始数据的 function Pright($ulogin,$operationid){ //PAGE_SCAN($ulogin,$operationid); switch(Security($ulogin)) {
case 'hinder':return false;break; case 'right':switch(overrides($ulogin,$operationid)){ case 'T':return true;break; case 'F':return false;break; case 'O': if(pageright($ulogin,$operationid)){ return true; }else{ return false; } break; } break; case 'authority':return true;break; default:return false;break;
} }////////////////////////判断用户是否受权限约束/////////////////// function Security($ulogin){ GLOBAL $CONFIG; $CONFIG->query="select username,isactive,securityenabled from userjob where username='".$ulogin."' and isactive='T'"; $result=db_query("select"); $rows=count($result)-1; if($rows>0){ for($i=0;$i<$rows;$i++){ if($result[$i][securityenabled]=='T') return 'authority'; } return 'right'; }else{ return 'hinder'; }
}///////////////判断用户在该模块中的权限////////////////////////////////////// function pageright($ulogin,$operationid){ GLOBAL $CONFIG; $right=Jobright($ulogin); if($right){ for($i=0;$i<count($right);$i++) { $CONFIG->query="select * from operation,groupjob where groupjob.groupname='".$right[$i][jobid]."' and groupjob.operationid='".$operationid."' and groupjob.operationid=operation.operationid"; //echo $CONFIG->query; $jobright=db_query("select"); if(!empty($jobright[0][operationid])){ return true; } } return false; }else{ return false; } } ///////////////////判断用户是否有有效的JOBID/////////////////////// function Jobright($ulogin){ GLOBAL $CONFIG;$j=0; $CONFIG->query="select * from userjob where username='".$ulogin."'"; $jobid=db_query("select"); $jobidrows=count($jobid)-1; for($i=0;$i<$jobidrows;$i++){ if((dateformt($jobid[$i][startdate])<=date("Ymd"))&&(date("Ymd")<=dateformt($jobid[$i][enddate]))) { $right[$j][jobid]=$jobid[$i][groupname]; $j++; } }
if(count($right)>0)return $right; else return false; }function dateformt($date) { $year=substr($date,0,4); $month=substr($date,5,2); $day=substr($date,8,2); return $year.$month.$day; } //////////////从用户附加功能表中读取operationid(功能代号)/////////////////////////////// function overrides($ulogin,$operationid) { GLOBAL $CONFIG; $CONFIG->query="select * from operation,overrides where overrides.username='".$ulogin."' and overrides.operationid='".$operationid."' and overrides.operationid=operation.operationid"; //echo $CONFIG->query;exit; $overrides=db_query("select"); $overridesrows=count($overrides)-1;
if($overridesrows>0){ if($overrides[0][enabled]=='T'){ return 'T'; }else if($overrides[0][enabled]=='F'){ return 'F'; }else{ return 'O'; } }else{ return 'O'; } }//////////////检测功能块的安全等级////////////////////////////////////// /* function loginlevel($operationid){ GLOBAL $dbSetting,$sysLang; $level = new database($dbSetting->dbsystem,$dbSetting->dbhost,$dbSetting->dbname,$dbSetting->dbuser,$dbSetting->dbpwd,$sysLang->language); $levelwhere="operationid='p".$operationid."'"; $level->query=create_select("loginlevel","p29012",$levelwhere,"1","No","No","No","No"); $level->db_query("select"); switch(trim($overrides->result[0][loginlevel])) { case '0': case '1': case '2':return true;break; case '3':break; default: return true;break; } } */////////////////判断是否有效登录////////////////// function USER_LOGING(){ GLOBAL $SAS_SESSION; if (!empty($SAS_SESSION[uloginid][username])){ return true; }else{ return false; } }///////////////判断用户是否对该界面有权限////////////////// function PAGE_SCAN($ulogin,$operationid){ GLOBAL $PAGE_RIGHT; if(USER_LOGING()){ switch(Security($ulogin)) {
case 'hinder':echo "无该页权限!";exit;return false;break; case 'right':switch(overrides($ulogin,$operationid)){ case 'T':return true;break; case 'F':echo "无该页权限!";exit; return false;break; case 'O': if(pageright($ulogin,$operationid)){ return true; }else{ echo "无该页权限!";exit; return false; } break; } break; case 'authority':return true;break; default: echo "无该页权限!";exit;break; } }else{ echo "请登录后再访问!";exit; return false; } } ?>
# -------------------------------------------------------- # # Table structure for table 'users' #CREATE TABLE users ( userid int(11) NOT NULL auto_increment, username varchar(20) NOT NULL, passwd varchar(50) NOT NULL, logincount int(11) NOT NULL, lastlogin datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, groupname varchar(20) NOT NULL, admin int(11) NOT NULL, PRIMARY KEY (username), KEY id_2 (userid) ); # -------------------------------------------------------- # # Table structure for table 'userjob' #CREATE TABLE userjob ( userjobid int(11) NOT NULL auto_increment, username varchar(30) NOT NULL, groupname varchar(30) NOT NULL, startdate date DEFAULT '0000-00-00' NOT NULL, enddate date DEFAULT '0000-00-00' NOT NULL, isactive char(1) NOT NULL, securityenabled char(1) NOT NULL, currtime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, PRIMARY KEY (username, groupname), UNIQUE userjobid (userjobid), KEY userjobid_2 (userjobid) ); # -------------------------------------------------------- # # Table structure for table 'groups' #CREATE TABLE groups ( groupid int(11) NOT NULL auto_increment, enname varchar(20) NOT NULL, cnname varchar(20) NOT NULL, PRIMARY KEY (groupid, enname, cnname), UNIQUE groupid (groupid), KEY groupid_2 (groupid) );# -------------------------------------------------------- # # Table structure for table 'groupjob' #CREATE TABLE groupjob ( groupname varchar(30) NOT NULL, operationid varchar(10) NOT NULL, PRIMARY KEY (operationid, groupname), KEY operationid (operationid) ); # -------------------------------------------------------- # # Table structure for table 'operation' #CREATE TABLE operation ( operationid varchar(10) NOT NULL, operationnm varchar(80) NOT NULL, submodnm varchar(20) NOT NULL, PRIMARY KEY (operationid), UNIQUE operationid (operationid), KEY operationid_2 (operationid) ); # -------------------------------------------------------- # # Table structure for table 'overrides' #CREATE TABLE overrides ( username varchar(30) NOT NULL, operationid varchar(10) NOT NULL, enabled char(1) NOT NULL, PRIMARY KEY (username, operationid), KEY operationid (operationid) );INSERT INTO users VALUES (1,'sas','dTbioRNb5evB6',0,'NOW()','sas',1); INSERT INTO groups VALUES (1,'sas','系统管理'); INSERT INTO userjob VALUES (1,'sas','sas','2002-06-17','2003-06-17','T','T','NOW()'); //////功能初始数据如下 INSERT INTO operation VALUES( '0200100000', 'OA--个人办公', '个人办公'); INSERT INTO operation VALUES( '0200100100', 'OA--个人办公--事务提醒', '个人办公'); INSERT INTO operation VALUES( '0200100200', 'OA--个人办公--即时通信', '个人办公'); INSERT INTO operation VALUES( '0200100300', 'OA--个人办公--日程安排', '个人办公'); INSERT INTO operation VALUES( '0200100301', 'OA--个人办公--日程安排--新增安排', '个人办公'); INSERT INTO operation VALUES( '0200100302', 'OA--个人办公--日程安排--添加注释', '个人办公'); INSERT INTO operation VALUES( '0200100303', 'OA--个人办公--日程安排--完成进度', '个人办公'); INSERT INTO operation VALUES( '0200100304', 'OA--个人办公--日程安排--更改安排', '个人办公'); INSERT INTO operation VALUES( '0200100305', 'OA--个人办公--日程安排--取消安排', '个人办公'); INSERT INTO operation VALUES( '0200100400', 'OA--个人办公--公司通讯录', '个人办公'); INSERT INTO operation VALUES( '0200100500', 'OA--个人办公--个人通讯录', '个人办公'); INSERT INTO operation VALUES( '0200100501', 'OA--个人办公--个人通讯录--查寻记录', '个人办公'); INSERT INTO operation VALUES( '0200100502', 'OA--个人办公--个人通讯录--添加记录', '个人办公'); INSERT INTO operation VALUES( '0200100503', 'OA--个人办公--个人通讯录--修改', '个人办公'); INSERT INTO operation VALUES( '0200100504', 'OA--个人办公--个人通讯录--删除', '个人办公'); INSERT INTO operation VALUES( '0200100600', 'OA--个人办公--个人资料', '个人办公'); INSERT INTO operation VALUES( '0200100700', 'OA--个人办公--桌面设定', '个人办公');
各个模块都存入数据库中,如:
标志 名称
A 人事管理
AA 查看个人档案
AB 修改档案
在这个账号的权限字段里写上:AA-AB 就表示这个人可以查看"个人档案"及"修改档案"。类似这样的。
另外,可将权限字段用SESSION存起来,每个页面再用代码分析,正如sdliubo(Fuck Japanese!)所说的。很想听听更好的方法。up
///////好比判断一个按扭该用户有没有则可以if(Pright($ulogin,$oterationid)){echo "<input type=button>";}其中$ulogin用户登进来session记录的用户的userid,而$oterationid整个功能表里的该按扭功能的ID因为要分功能则必有所有功能的功能表,且这个表是系统一开始就有初始数据的
function Pright($ulogin,$operationid){
//PAGE_SCAN($ulogin,$operationid);
switch(Security($ulogin))
{
case 'hinder':return false;break;
case 'right':switch(overrides($ulogin,$operationid)){
case 'T':return true;break;
case 'F':return false;break;
case 'O': if(pageright($ulogin,$operationid)){
return true;
}else{
return false;
}
break;
}
break;
case 'authority':return true;break;
default:return false;break;
}
}////////////////////////判断用户是否受权限约束///////////////////
function Security($ulogin){
GLOBAL $CONFIG;
$CONFIG->query="select username,isactive,securityenabled from userjob where username='".$ulogin."' and isactive='T'";
$result=db_query("select");
$rows=count($result)-1;
if($rows>0){
for($i=0;$i<$rows;$i++){
if($result[$i][securityenabled]=='T')
return 'authority';
}
return 'right';
}else{
return 'hinder';
}
}///////////////判断用户在该模块中的权限//////////////////////////////////////
function pageright($ulogin,$operationid){
GLOBAL $CONFIG;
$right=Jobright($ulogin);
if($right){
for($i=0;$i<count($right);$i++)
{
$CONFIG->query="select * from operation,groupjob where groupjob.groupname='".$right[$i][jobid]."' and groupjob.operationid='".$operationid."' and groupjob.operationid=operation.operationid";
//echo $CONFIG->query;
$jobright=db_query("select");
if(!empty($jobright[0][operationid])){
return true;
}
}
return false;
}else{
return false;
}
}
///////////////////判断用户是否有有效的JOBID///////////////////////
function Jobright($ulogin){
GLOBAL $CONFIG;$j=0;
$CONFIG->query="select * from userjob where username='".$ulogin."'";
$jobid=db_query("select");
$jobidrows=count($jobid)-1;
for($i=0;$i<$jobidrows;$i++){
if((dateformt($jobid[$i][startdate])<=date("Ymd"))&&(date("Ymd")<=dateformt($jobid[$i][enddate])))
{
$right[$j][jobid]=$jobid[$i][groupname];
$j++;
}
}
if(count($right)>0)return $right; else return false;
}function dateformt($date)
{
$year=substr($date,0,4);
$month=substr($date,5,2);
$day=substr($date,8,2);
return $year.$month.$day;
}
//////////////从用户附加功能表中读取operationid(功能代号)///////////////////////////////
function overrides($ulogin,$operationid)
{
GLOBAL $CONFIG;
$CONFIG->query="select * from operation,overrides where overrides.username='".$ulogin."' and overrides.operationid='".$operationid."' and overrides.operationid=operation.operationid";
//echo $CONFIG->query;exit;
$overrides=db_query("select");
$overridesrows=count($overrides)-1;
if($overridesrows>0){
if($overrides[0][enabled]=='T'){
return 'T';
}else if($overrides[0][enabled]=='F'){
return 'F';
}else{
return 'O';
} }else{
return 'O';
}
}//////////////检测功能块的安全等级//////////////////////////////////////
/*
function loginlevel($operationid){
GLOBAL $dbSetting,$sysLang;
$level = new database($dbSetting->dbsystem,$dbSetting->dbhost,$dbSetting->dbname,$dbSetting->dbuser,$dbSetting->dbpwd,$sysLang->language);
$levelwhere="operationid='p".$operationid."'";
$level->query=create_select("loginlevel","p29012",$levelwhere,"1","No","No","No","No");
$level->db_query("select");
switch(trim($overrides->result[0][loginlevel]))
{
case '0':
case '1':
case '2':return true;break;
case '3':break;
default: return true;break;
}
}
*/////////////////判断是否有效登录//////////////////
function USER_LOGING(){
GLOBAL $SAS_SESSION;
if (!empty($SAS_SESSION[uloginid][username])){
return true;
}else{
return false;
}
}///////////////判断用户是否对该界面有权限//////////////////
function PAGE_SCAN($ulogin,$operationid){
GLOBAL $PAGE_RIGHT;
if(USER_LOGING()){
switch(Security($ulogin))
{
case 'hinder':echo "无该页权限!";exit;return false;break;
case 'right':switch(overrides($ulogin,$operationid)){
case 'T':return true;break;
case 'F':echo "无该页权限!";exit; return false;break;
case 'O': if(pageright($ulogin,$operationid)){
return true;
}else{
echo "无该页权限!";exit; return false;
}
break;
}
break;
case 'authority':return true;break;
default: echo "无该页权限!";exit;break;
}
}else{
echo "请登录后再访问!";exit;
return false;
}
}
?>
#
# Table structure for table 'users'
#CREATE TABLE users (
userid int(11) NOT NULL auto_increment,
username varchar(20) NOT NULL,
passwd varchar(50) NOT NULL,
logincount int(11) NOT NULL,
lastlogin datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
groupname varchar(20) NOT NULL,
admin int(11) NOT NULL,
PRIMARY KEY (username),
KEY id_2 (userid)
);
# --------------------------------------------------------
#
# Table structure for table 'userjob'
#CREATE TABLE userjob (
userjobid int(11) NOT NULL auto_increment,
username varchar(30) NOT NULL,
groupname varchar(30) NOT NULL,
startdate date DEFAULT '0000-00-00' NOT NULL,
enddate date DEFAULT '0000-00-00' NOT NULL,
isactive char(1) NOT NULL,
securityenabled char(1) NOT NULL,
currtime datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
PRIMARY KEY (username, groupname),
UNIQUE userjobid (userjobid),
KEY userjobid_2 (userjobid)
);
# --------------------------------------------------------
#
# Table structure for table 'groups'
#CREATE TABLE groups (
groupid int(11) NOT NULL auto_increment,
enname varchar(20) NOT NULL,
cnname varchar(20) NOT NULL,
PRIMARY KEY (groupid, enname, cnname),
UNIQUE groupid (groupid),
KEY groupid_2 (groupid)
);# --------------------------------------------------------
#
# Table structure for table 'groupjob'
#CREATE TABLE groupjob (
groupname varchar(30) NOT NULL,
operationid varchar(10) NOT NULL,
PRIMARY KEY (operationid, groupname),
KEY operationid (operationid)
);
# --------------------------------------------------------
#
# Table structure for table 'operation'
#CREATE TABLE operation (
operationid varchar(10) NOT NULL,
operationnm varchar(80) NOT NULL,
submodnm varchar(20) NOT NULL,
PRIMARY KEY (operationid),
UNIQUE operationid (operationid),
KEY operationid_2 (operationid)
);
# --------------------------------------------------------
#
# Table structure for table 'overrides'
#CREATE TABLE overrides (
username varchar(30) NOT NULL,
operationid varchar(10) NOT NULL,
enabled char(1) NOT NULL,
PRIMARY KEY (username, operationid),
KEY operationid (operationid)
);INSERT INTO users VALUES (1,'sas','dTbioRNb5evB6',0,'NOW()','sas',1); INSERT INTO groups VALUES (1,'sas','系统管理');
INSERT INTO userjob VALUES (1,'sas','sas','2002-06-17','2003-06-17','T','T','NOW()');
//////功能初始数据如下
INSERT INTO operation VALUES( '0200100000', 'OA--个人办公', '个人办公');
INSERT INTO operation VALUES( '0200100100', 'OA--个人办公--事务提醒', '个人办公');
INSERT INTO operation VALUES( '0200100200', 'OA--个人办公--即时通信', '个人办公');
INSERT INTO operation VALUES( '0200100300', 'OA--个人办公--日程安排', '个人办公');
INSERT INTO operation VALUES( '0200100301', 'OA--个人办公--日程安排--新增安排', '个人办公');
INSERT INTO operation VALUES( '0200100302', 'OA--个人办公--日程安排--添加注释', '个人办公');
INSERT INTO operation VALUES( '0200100303', 'OA--个人办公--日程安排--完成进度', '个人办公');
INSERT INTO operation VALUES( '0200100304', 'OA--个人办公--日程安排--更改安排', '个人办公');
INSERT INTO operation VALUES( '0200100305', 'OA--个人办公--日程安排--取消安排', '个人办公');
INSERT INTO operation VALUES( '0200100400', 'OA--个人办公--公司通讯录', '个人办公');
INSERT INTO operation VALUES( '0200100500', 'OA--个人办公--个人通讯录', '个人办公');
INSERT INTO operation VALUES( '0200100501', 'OA--个人办公--个人通讯录--查寻记录', '个人办公');
INSERT INTO operation VALUES( '0200100502', 'OA--个人办公--个人通讯录--添加记录', '个人办公');
INSERT INTO operation VALUES( '0200100503', 'OA--个人办公--个人通讯录--修改', '个人办公');
INSERT INTO operation VALUES( '0200100504', 'OA--个人办公--个人通讯录--删除', '个人办公');
INSERT INTO operation VALUES( '0200100600', 'OA--个人办公--个人资料', '个人办公');
INSERT INTO operation VALUES( '0200100700', 'OA--个人办公--桌面设定', '个人办公');
<?php if(Pright($SAS_SESSION[userlogin][uloginid],"0200600203")){ ?>
<INPUT TYPE="button" class="ipsub" value="查看库存" onclick="javascript:location.href='showstock.php';">
<?php } ?>
<?php if(Pright($SAS_SESSION[userlogin][uloginid],"0200600204")){ ?>
<INPUT TYPE="button" class="ipsub" value="查看分配" onclick="javascript:location.href='allotres.php';">
<?php } ?>
</td>
</tr>
[email protected]
用户号
。。
用户角色表
用户号
角色号角色表
角色号
。。
权限表
权限号
菜单号
。。
角色权限表
角色号
权限号利用用户的登陆id的这个session
在每个页面上面得到权限直,调用函数显示是否可以
利用上面的表建立一个视图,3个字段(用户号,权限直,菜单号)
这个试图通过用户表,用户角色表,角色表,角色权限表,权限表连接查询得出,通过视图可以提高速度简化提取过程。如果没有视图就直接写sql了
function getRight(UserId, MenuId)
{
global $database,$host,$dbusername,$dbpassword;
$conn=new DB_Sql();
$conn->connect($database, $host, $dbusername,$dbpassword);
$query="select RightTag from view_user_right";
$conn->query($query);
$conn->next_record();
return $conn->f(RightTag);
}
在也面中你可以在也面前加一个
<?php
$menu_id=99;
if (getRight($s_user_id,$menu_id)==0)//have no right
header ("location:noright.php");
?>
同时为了控制写权限和读权限,可以在按扭中家一个函数如下
<input type="button" onclick="wendow.location='del.php?id=<?php echo $mydb->f(id);?>'" checkright($s_user_id,$menu_id)>
这个checkright的函数如下
fucntion checkright()
{
if (getRight($s_user_id,$menu_id)==1)//only have read right
{
echo "disabled";//让按扭不能工作
}
else if (getRight($s_user_id,$menu_id)==2)//have write right
{
echo "";
}
}
这样就可以实现通过用户角色机智,和按扭屏蔽控制权限
最好做成试图,因为视图比多表查询快。(放在内存中的)
但需要注意的是,同一个用户可以属于多个角色,也可以同时属于多个部门。而角色和部门对于用户来讲是共存的。
所以一共设计以下几张表:
用户表:字段:USERNAME,PASSWD 用于存放用户名/密码
角色表:ACTOR_ID,USERNAME 用于表示用户属于哪个角色,一个用户可以有多条记录。
部门表:BUMEN_ID,USERNAME 用于表示用户属于哪个角色,一个用户可以有多条记录。
角色-权限表:ACTOR_ID,BLOCK_ID,QX 用于表示角色在版块的权限值,这样你需要把所有的页面都给上一个版块号。
部门-权限表:BUMEN_ID,BLOCK_ID,QX 用于表示部门在版块的权限值。这样可以写出一个统一的函数,取得某一个用户在某一个版块的权限。这里权限采用“并”的方式,即只要有一个角色或一个部门有权限则表示有权限,多个角色、多个部门都有权限则取权限的最大值。如果有特殊情况需要临时增加和减少权限,则需要多加一张表:
USERNAME,BLOCK_ID,QX 如果在这个表中有记录,则取这张表的值,如果没有则按上面的办法取权限值。这张表还可以加上起始时间字段,这样临时设置的权限可以在一定的时间内有效。页面的判断。首先要对整个系统设置版块。每个页面根据版块设置版块号。然后将用户名(一般用SESSION)和版块号传入权限函数取得权限值,根据这个权限值在页面上用程序判断即可
group //组
site //职位
other //其它
is_enter //能否进入
以上是数据库的各个字段
每次进入前将你事先设定好的条件update一下你的is_enter这个字段的内容,能访问者为1,不能者为0,然后根据其值进行操作就是了;
这样的数据库结构和实现截止都是比较成熟的结构。
做oa嘛都是你抄我,我抄你。
然后不同的版块判断一下session就可以啦:)
开源的
http://phpgacl.sourceforge.net/
非常强大
有完整文档和demo