最近在幫客戶設計開發網站需要做一個tadnews模組區塊的二次開發,遇到一個問題,就是客戶有針對tadnews的分類設定可讀取的權限,例如->校內公告,只有管理員跟註冊會員才能觀看,訪客是看不到的,所以在區塊開發的時候就要判斷哪些分類是瀏覽者所在權限可以觀看的,哪些是不能看的,例如下面的資料表內容:
校內公告的enable_group欄位有一個(1,2)的字串,其他為空值,按照tadnews模組的設計空值為全部都能觀看不設瀏覽條件,有設條件的必須與Xoops的user所屬群組相符才能觀看,所以校內公告只有管理員跟註冊會員才能觀看,接下來就是要寫段code來判斷user具有瀏覽哪些分類的權限。
模組區塊後台建立分類變數假設為$options[1],共選擇要顯示8個分類
所以區塊主函式接收到的 $options[1]變數值會是1,2,3,4,5,6,7,8 (資料表的ncsn值)
接下來就是要來判斷user所在的群組跟比對enable_group欄位數值的code(判斷瀏覽權限)
global $xoopsDB, $xoTheme,$xoopsUser,$xoopsConfig; //需要global的全域變數
$mydirname = $options[1] ;
/*=======區塊分類瀏覽權限設置============*/
//吧後端傳送過來分類字串接割成陣列,在寫成sql語法的where格式
$optionsval=preg_split('/,/',$mydirname);
$optionscount=count($optionsval)-1;
接下來用訪客進入網站echo $mydirname 只會顯示 1,2,3,4,5,6,7,8分類被剃除掉了,再用管理員及訪客觀看,則會顯示1,2,3,4,5,6,7,8,所有分類都能觀看,實際測試看看。
註冊會員+管理員,校內公告分類選單及內容都有顯在頁面上
接下來用訪客進入網站,確認校內公告及資料都沒有被讀取,沒有顯示在頁面上!
所以瀏覽權限判斷機制是有效的,有需要的朋友可以參考看看!!若有更好的方法也歡迎一起研究!
※2017/10/11補充說明,如果是用ajax方式接收下拉選單數值查詢資料,那還需要再ajax檔加上以下的判斷語法,防止被人用外部傳入變數方查詢隱藏分類資料內容!
//接收樣板端送過過來的選單分類數值
global $xoopsDB, $xoTheme,$xoopsUser,$xoopsConfig;
$selectid=(empty($_REQUEST['selectid']))?"":$_REQUEST['selectid'];
if(!empty($selectid)){
//ajax防外部傳入變數查詢隱藏分類資料內容
$sql = "select ncsn,enable_group
from " . $xoopsDB->prefix('tad_news_cate') . "
where `ncsn`={$selectid}";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
$myts =& MyTextSanitizer::getInstance();
list($ncsn,$enable_group) = $xoopsDB -> fetchRow($result);
if(empty($enable_group)){
$selectid=$ncsn;
}else{
if ($xoopsUser){
$modulesadmin=$xoopsUser->isAdmin();
foreach($xoopsUser->groups() as $i){
$possible=split(',',$enable_group);
if(in_array("$i",$possible)){
$possibleuser=true; //如果判斷有權限存入true
}
}
}
if($possibleuser==true){
$selectid=$ncsn;
}else{
$selectid='0';
}
}
}
這樣即使有心人用外部引入本機的ajax檔,傳送變數也會經過判斷,才顯示資料內容,不會被讀取隱藏的分類資料內容。
教學撰寫:徐嘉裕 Neil hsu
校內公告的enable_group欄位有一個(1,2)的字串,其他為空值,按照tadnews模組的設計空值為全部都能觀看不設瀏覽條件,有設條件的必須與Xoops的user所屬群組相符才能觀看,所以校內公告只有管理員跟註冊會員才能觀看,接下來就是要寫段code來判斷user具有瀏覽哪些分類的權限。
模組區塊後台建立分類變數假設為$options[1],共選擇要顯示8個分類
所以區塊主函式接收到的 $options[1]變數值會是1,2,3,4,5,6,7,8 (資料表的ncsn值)
接下來就是要來判斷user所在的群組跟比對enable_group欄位數值的code(判斷瀏覽權限)
/*=======區塊分類瀏覽權限設置============*/
//吧後端傳送過來分類字串接割成陣列,在寫成sql語法的where格式
$optionsval=preg_split('/,/',$mydirname);
$optionscount=count($optionsval)-1;
foreach($optionsval as $key=> $val){
if($optionscount==$key){
$y='';
}else{
$y='||';
}
$Searchfield.="`ncsn`=$val {$y}";
}
//查詢tad_news_cate資料表中enable_group數值
$sql = "select ncsn,enable_group
from " . $xoopsDB->prefix('tad_news_cate') . "
where $Searchfield";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($ncsn,$enable_group) = $xoopsDB -> fetchRow($result)){
if(empty($enable_group)){ //判斷enable_group為空值代表沒設瀏覽權限的分類
$ncsntrue.=$ncsn.','; //吧沒設瀏覽權限的$ncsn存入$ncsntrue中
}else{
//如果enable_group有數值代表有設權限,以USER所在群組比對enable_group數值後判斷該USER是否有觀看分類權限
if ($xoopsUser){
$modulesadmin=$xoopsUser->isAdmin();
foreach($xoopsUser->groups() as $i){
$possible=split(',',$enable_group);
if(in_array("$i",$possible)){
$possibleuser=true; //如果判斷有權限存入true
} }
if($possibleuser==true){
$ncsntrue.=$ncsn.','; //吧有設瀏覽權限確認user可瀏覽的$ncsn存入$ncsntrue中
}
}
}
}
//去除$ncsntrue的最後一個字元
if($optionscount==$key){
$y='';
}else{
$y='||';
}
$Searchfield.="`ncsn`=$val {$y}";
}
//查詢tad_news_cate資料表中enable_group數值
$sql = "select ncsn,enable_group
from " . $xoopsDB->prefix('tad_news_cate') . "
where $Searchfield";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
while(list($ncsn,$enable_group) = $xoopsDB -> fetchRow($result)){
if(empty($enable_group)){ //判斷enable_group為空值代表沒設瀏覽權限的分類
$ncsntrue.=$ncsn.','; //吧沒設瀏覽權限的$ncsn存入$ncsntrue中
}else{
//如果enable_group有數值代表有設權限,以USER所在群組比對enable_group數值後判斷該USER是否有觀看分類權限
if ($xoopsUser){
$modulesadmin=$xoopsUser->isAdmin();
foreach($xoopsUser->groups() as $i){
$possible=split(',',$enable_group);
if(in_array("$i",$possible)){
$possibleuser=true; //如果判斷有權限存入true
} }
if($possibleuser==true){
$ncsntrue.=$ncsn.','; //吧有設瀏覽權限確認user可瀏覽的$ncsn存入$ncsntrue中
}
}
}
}
//去除$ncsntrue的最後一個字元
$mydirname=substr($ncsntrue,0,-1);
接下來用訪客進入網站echo $mydirname 只會顯示 1,2,3,4,5,6,7,8分類被剃除掉了,再用管理員及訪客觀看,則會顯示1,2,3,4,5,6,7,8,所有分類都能觀看,實際測試看看。
註冊會員+管理員,校內公告分類選單及內容都有顯在頁面上
接下來用訪客進入網站,確認校內公告及資料都沒有被讀取,沒有顯示在頁面上!
所以瀏覽權限判斷機制是有效的,有需要的朋友可以參考看看!!若有更好的方法也歡迎一起研究!
※2017/10/11補充說明,如果是用ajax方式接收下拉選單數值查詢資料,那還需要再ajax檔加上以下的判斷語法,防止被人用外部傳入變數方查詢隱藏分類資料內容!
//接收樣板端送過過來的選單分類數值
global $xoopsDB, $xoTheme,$xoopsUser,$xoopsConfig;
$selectid=(empty($_REQUEST['selectid']))?"":$_REQUEST['selectid'];
if(!empty($selectid)){
//ajax防外部傳入變數查詢隱藏分類資料內容
$sql = "select ncsn,enable_group
from " . $xoopsDB->prefix('tad_news_cate') . "
where `ncsn`={$selectid}";
$result = $xoopsDB->query($sql)
or redirect_header($_SERVER['PHP_SELF'],3, mysql_error());
$myts =& MyTextSanitizer::getInstance();
list($ncsn,$enable_group) = $xoopsDB -> fetchRow($result);
if(empty($enable_group)){
$selectid=$ncsn;
}else{
if ($xoopsUser){
$modulesadmin=$xoopsUser->isAdmin();
foreach($xoopsUser->groups() as $i){
$possible=split(',',$enable_group);
if(in_array("$i",$possible)){
$possibleuser=true; //如果判斷有權限存入true
}
}
}
if($possibleuser==true){
$selectid=$ncsn;
}else{
$selectid='0';
}
}
}
這樣即使有心人用外部引入本機的ajax檔,傳送變數也會經過判斷,才顯示資料內容,不會被讀取隱藏的分類資料內容。
教學撰寫:徐嘉裕 Neil hsu
留言
張貼留言