4個(gè)表
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)津南免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
用戶表(用戶信息表)
權(quán)限表(設(shè)置可以訪問的頁面)
角色表(如果申請(qǐng)用戶的時(shí)候有多項(xiàng)選擇的時(shí)候添加,沒有則不需要)
用戶權(quán)限對(duì)應(yīng)關(guān)系表(這個(gè)表是用于給每個(gè)用戶賦權(quán))
如果用戶訪問頁面的時(shí)候,判斷是否存在訪問權(quán)限(查用戶權(quán)限對(duì)應(yīng)關(guān)系表),如果有正常訪問,如果沒有頁面跳轉(zhuǎn)。不過跳到登錄頁面感覺不太合理,你判斷用戶是否有權(quán)限的時(shí)候,他應(yīng)該是登錄狀態(tài),如果再跳到登錄頁面感覺不合理。
判斷是否存在訪問權(quán)限可以封裝成公共類,每個(gè)頁面初始化的時(shí)候都調(diào)用這個(gè)公共類??梢酝ㄟ^用戶ID進(jìn)行判斷。
同是普通用戶,那就加標(biāo)識(shí),判斷的時(shí)候再判斷一下標(biāo)識(shí),然后根據(jù)標(biāo)識(shí)進(jìn)行頁面跳轉(zhuǎn)。
以上,希望能幫到你。
ThinkPHP權(quán)限認(rèn)證Auth實(shí)例詳解ThinkPHP權(quán)限認(rèn)證Auth實(shí)例,本文以實(shí)例代碼的形式深入剖析了ThinkPHP權(quán)限認(rèn)證Auth的實(shí)現(xiàn)原理與方法,具體步驟如下:mysql數(shù)據(jù)庫部分sql代碼:?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172--------------------------------Tablestructureforthink_auth_group------------------------------DROPTABLEIFEXISTS`think_auth_group`;CREATETABLE`think_auth_group`(`id`mediumint(8)unsignedNOTNULLAUTO_INCREMENT,`title`char(100)NOTNULLDEFAULT'',`status`tinyint(1)NOTNULLDEFAULT'1',`rules`char(80)NOTNULLDEFAULT'',PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=2DEFAULTCHARSET=utf8COMMENT='用戶組表';--------------------------------Recordsofthink_auth_group------------------------------INSERTINTO`think_auth_group`VALUES('1','管理組','1','1,2');--------------------------------Tablestructureforthink_auth_group_access------------------------------DROPTABLEIFEXISTS`think_auth_group_access`;CREATETABLE`think_auth_group_access`(`uid`mediumint(8)unsignedNOTNULLCOMMENT'用戶id',`group_id`mediumint(8)unsignedNOTNULLCOMMENT'用戶組id',UNIQUEKEY`uid_group_id`(`uid`,`group_id`),KEY`uid`(`uid`),KEY`group_id`(`group_id`))ENGINE=MyISAMDEFAULTCHARSET=utf8COMMENT='用戶組明細(xì)表';--------------------------------Recordsofthink_auth_group_access------------------------------INSERTINTO`think_auth_group_access`VALUES('1','1');INSERTINTO`think_auth_group_access`VALUES('1','2');--------------------------------Tablestructureforthink_auth_rule------------------------------DROPTABLEIFEXISTS`think_auth_rule`;CREATETABLE`think_auth_rule`(`id`mediumint(8)unsignedNOTNULLAUTO_INCREMENT,`name`char(80)NOTNULLDEFAULT''COMMENT'規(guī)則唯一標(biāo)識(shí)',`title`char(20)NOTNULLDEFAULT''COMMENT'規(guī)則中文名稱',`status`tinyint(1)NOTNULLDEFAULT'1'COMMENT'狀態(tài):為1正常,為0禁用',`type`char(80)NOTNULL,`condition`char(100)NOTNULLDEFAULT''COMMENT'規(guī)則表達(dá)式,為空表示存在就驗(yàn)證,不為空表示按照條件驗(yàn)證',PRIMARYKEY(`id`),UNIQUEKEY`name`(`name`))ENGINE=MyISAMAUTO_INCREMENT=5DEFAULTCHARSET=utf8COMMENT='規(guī)則表';--------------------------------Recordsofthink_auth_rule------------------------------INSERTINTO`think_auth_rule`VALUES('1','Home/index','列表','1','Home','');INSERTINTO`think_auth_rule`VALUES('2','Home/add','添加','1','Home','');INSERTINTO`think_auth_rule`VALUES('3','Home/edit','編輯','1','Home','');INSERTINTO`think_auth_rule`VALUES('4','Home/delete','刪除','1','Home','');DROPTABLEIFEXISTS`think_user`;CREATETABLE`think_user`(`id`int(11)NOTNULL,`username`varchar(30)DEFAULTNULL,`password`varchar(32)DEFAULTNULL,`age`tinyint(2)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;--------------------------------Recordsofthink_user------------------------------INSERTINTO`think_user`VALUES('1','admin','21232f297a57a5a743894a0e4a801fc3','25');配置文件Application\Common\Conf\config.php部分:?12345678910111213141516171819202122'配置值''DB_DSN'='',//數(shù)據(jù)庫連接DSN用于PDO方式'DB_TYPE'='mysql',//數(shù)據(jù)庫類型'DB_HOST'='localhost',//服務(wù)器地址'DB_NAME'='thinkphp',//數(shù)據(jù)庫名'DB_USER'='root',//用戶名'DB_PWD'='root',//密碼'DB_PORT'=3306,//端口'DB_PREFIX'='think_',//數(shù)據(jù)庫表前綴'AUTH_CONFIG'=array('AUTH_ON'=true,//認(rèn)證開關(guān)'AUTH_TYPE'=1,//認(rèn)證方式,1為時(shí)時(shí)認(rèn)證;2為登錄認(rèn)證。'AUTH_GROUP'='think_auth_group',//用戶組數(shù)據(jù)表名'AUTH_GROUP_ACCESS'='think_auth_group_access',//用戶組明細(xì)表'AUTH_RULE'='think_auth_rule',//權(quán)限規(guī)則表'AUTH_USER'='think_user'//用戶信息表));項(xiàng)目Home控制器部分Application\Home\Controller\IndexController.class.php代碼:?123456789101112131415161718192021222324check($name,$uid,$type,$mode,$relation)){die('認(rèn)證:成功');}else{die('認(rèn)證:失敗');}}}以上這些代碼就是最基本的驗(yàn)證代碼示例。下面是源碼閱讀:1、權(quán)限檢驗(yàn)類初始化配置信息:?1$Auth=new\Think\Auth();創(chuàng)建一個(gè)對(duì)象時(shí)程序會(huì)合并配置信息程序會(huì)合并Application\Common\Conf\config.php中的AUTH_CONFIG數(shù)組?1234567891011publicfunction__construct(){$prefix=C('DB_PREFIX');$this-_config['AUTH_GROUP']=$prefix.$this-_config['AUTH_GROUP'];$this-_config['AUTH_RULE']=$prefix.$this-_config['AUTH_RULE'];$this-_config['AUTH_USER']=$prefix.$this-_config['AUTH_USER'];$this-_config['AUTH_GROUP_ACCESS']=$prefix.$this-_config['AUTH_GROUP_ACCESS'];if(C('AUTH_CONFIG')){//可設(shè)置配置項(xiàng)AUTH_CONFIG,此配置項(xiàng)為數(shù)組。$this-_config=array_merge($this-_config,C('AUTH_CONFIG'));}}2、檢查權(quán)限:?1check($name,$uid,$type=1,$mode='url',$relation='or')大體分析一下這個(gè)方法首先判斷是否關(guān)閉權(quán)限校驗(yàn)如果配置信息AUTH_ON=false則不會(huì)進(jìn)行權(quán)限驗(yàn)證否則繼續(xù)驗(yàn)證權(quán)限?123if(!$this-_config['AUTH_ON']){returntrue;}獲取權(quán)限列表之后會(huì)詳細(xì)介紹:?1$authList=$this-getAuthList($uid,$type);此次需要驗(yàn)證的規(guī)則列表轉(zhuǎn)換成數(shù)組:?12345678if(is_string($name)){$name=strtolower($name);if(strpos($name,',')!==false){$name=explode(',',$name);}else{$name=array($name);}}所以$name參數(shù)是不區(qū)分大小寫的,最終都會(huì)轉(zhuǎn)換成小寫開啟url模式時(shí)全部轉(zhuǎn)換為小寫:?123if($mode=='url'){$REQUEST=unserialize(strtolower(serialize($_REQUEST)));}權(quán)限校驗(yàn)核心代碼段之一,即循環(huán)所有該用戶權(quán)限判斷當(dāng)前需要驗(yàn)證的權(quán)限是否在用戶授權(quán)列表中:?12345678910111213foreach($authListas$auth){$query=preg_replace('/^.+\?/U','',$auth);//獲取url參數(shù)if($mode=='url'$query!=$auth){parse_str($query,$param);//獲取數(shù)組形式url參數(shù)$intersect=array_intersect_assoc($REQUEST,$param);$auth=preg_replace('/\?.*$/U','',$auth);//獲取訪問的url文件if(in_array($auth,$name)$intersect==$param){//如果節(jié)點(diǎn)相符且url參數(shù)滿足$list[]=$auth;}}elseif(in_array($auth,$name)){$list[]=$auth;}}in_array($auth,$name)如果權(quán)限列表中其中一條權(quán)限等于當(dāng)前需要校驗(yàn)的權(quán)限則加入到$list中注:?12345678910111213$list=array();//保存驗(yàn)證通過的規(guī)則名if($relation=='or'and!empty($list)){returntrue;}$diff=array_diff($name,$list);if($relation=='and'andempty($diff)){returntrue;}$relation=='or'and!empty($list);//當(dāng)or時(shí)只要有一條是通過的則權(quán)限為真$relation=='and'andempty($diff);//當(dāng)and時(shí)$name與$list完全相等時(shí)權(quán)限為真3、獲取權(quán)限列表:?1$authList=$this-getAuthList($uid,$type);//獲取用戶需要驗(yàn)證的所有有效規(guī)則列表這個(gè)主要流程:獲取用戶組?12$groups=$this-getGroups($uid);//SELECT`rules`FROMthink_auth_group_accessaINNERJOINthink_auth_groupgona.group_id=g.idWHERE(a.uid='1'andg.status='1')簡(jiǎn)化操作就是:?1SELECT`rules`FROMthink_auth_groupWHERESTATUS='1'ANDid='1'//按正常流程去think_auth_group_access表中內(nèi)聯(lián)有點(diǎn)多余.!取得用戶組rules規(guī)則字段這個(gè)字段中保存的是think_auth_rule規(guī)則表的id用,分割$ids就是$groups變量最終轉(zhuǎn)換成的id數(shù)組:?12345$map=array('id'=array('in',$ids),'type'=$type,'status'=1,);取得think_auth_rule表中的規(guī)則信息,之后循環(huán):?123456789101112131415foreach($rulesas$rule){if(!empty($rule['condition'])){//根據(jù)condition進(jìn)行驗(yàn)證$user=$this-getUserInfo($uid);//獲取用戶信息,一維數(shù)組$command=preg_replace('/\{(\w*?)\}/','$user[\'\\1\']',$rule['condition']);//dump($command);//debug@(eval('$condition=('.$command.');'));if($condition){$authList[]=strtolower($rule['name']);}}else{//只要存在就記錄$authList[]=strtolower($rule['name']);}}if(!empty($rule['condition'])){//根據(jù)condition進(jìn)行驗(yàn)證這里就可以明白getUserInfo會(huì)去獲取配置文件AUTH_USER對(duì)應(yīng)表名去查找用戶信息重點(diǎn)是:?12$command=preg_replace('/\{(\w*?)\}/','$user[\'\\1\']',$rule['condition']);@(eval('$condition=('.$command.');'));'/\{(\w*?)\}/可以看成要匹配的文字為{字符串}那么{字符串}會(huì)替換成$user['字符串']$command=$user['字符串']如果?12345$rule['condition']='{age}';$command=$user['age']$rule['condition']='{age}5';$command=$user['age']10@(eval('$condition=('.$command.');'));即:?1$condition=($user['age']10);這時(shí)再看下面代碼如果為真則加為授權(quán)列表?123if($condition){$authList[]=strtolower($rule['name']);}
你記住 所有在 引號(hào)里面的 東西都是字符串!?。。?!
if("SELECT username,passwd FROM wen WHERE $username=$user,$passwd=$passwd"){
echo "scriptalert('歡迎登錄!');window.location.href='index1.php';/script";
}
這一句代碼本身就是不通的.
還有就是 你的sql語句也是錯(cuò)誤的。
參考如下:
$sql = 'SELECT username,passwd FROM wen WHERE username="'.$user.'" AND passwd="'.$passwd.'"';
$result = mysql_query($sql,$conn);
手動(dòng)回復(fù),不謝
可以使用acl控制實(shí)現(xiàn),參考acl全集如下:
1、角色表
角色id - 用戶組id - 特殊權(quán)限id(其中特殊權(quán)限 用戶組所包含權(quán)限)
2、用戶組表
用戶組id - 用戶組信息
3、權(quán)限表
權(quán)限表id - 權(quán)限信息 - 與功能模塊的關(guān)系
4、用戶組-權(quán)限關(guān)聯(lián)表
用戶組id - 權(quán)限集合
5、特殊權(quán)限表
特殊權(quán)限id - 權(quán)限集合
注意:
1、設(shè)置權(quán)限的刪除、添加主要圍繞在 用戶組-權(quán)限關(guān)聯(lián)表、特殊權(quán)限表。
2、用戶的權(quán)限獲取則是驗(yàn)證登陸的時(shí)候通過用戶組和特殊權(quán)限獲取權(quán)限集合。
3、展示的時(shí)候,根據(jù)2獲取的權(quán)限集合從權(quán)限表獲取所有功能模塊的導(dǎo)航菜單。
這個(gè)網(wǎng)上方法挺多的,個(gè)人認(rèn)為最簡(jiǎn)單的就是在管理員表加個(gè)權(quán)限字段,在顯示欄目處加個(gè)判斷,不過這種方法不是很安全;再就是在數(shù)據(jù)庫建張node表、role表、role_user表、access表,其中node表存放結(jié)點(diǎn),也就是欄目,role表存放權(quán)限,role_user表就是用戶權(quán)限表,access表存放node_id、role_id等,不過中間有好多細(xì)節(jié)需要好好琢磨
利用session和cookie實(shí)現(xiàn),
session是保存在服務(wù)器的會(huì)話記錄,當(dāng)管理員登陸后,對(duì)于每個(gè)管理操作,都有一段PHP代碼用于檢查session中的用戶是否管理員身份,是則允許管理操作;
cookie是保存在瀏覽器的登陸數(shù)據(jù),譬如登陸之后瀏覽器存下了用戶名和登陸密碼,每次與服務(wù)器的會(huì)話都向服務(wù)器發(fā)送cookie的數(shù)據(jù),此過程中PHP提取cookie里的用戶名和密碼信息進(jìn)行校驗(yàn),通過后允許管理操作。