【Layui】許可權管理
阿新 • • 發佈:2019-01-11
author:咔咔
wechat:fangkangfk
html導航單顯示
{include file="../../../application/admin/view/public/head" /} <style type="text/css"> .hs-iframe{width:100%;height:100%;} .layui-tab{position:absolute;left:0;top:0;height:100%;width:100%;z-index:10;margin:0;border:none;overflow:hidden;} .layui-tab-title li:first-child > i { display: none; } .layui-tab-content{padding:0 0 0 10px;height:100%;} .layui-tab-item{height:100%;} .layui-nav-tree .layui-nav-child a{height:38px;line-height: 38px;} .footer{position:fixed;left:0;bottom:0;z-index:998;} </style> <div class="layui-layout layui-layout-admin"> <div class="layui-header"> <div class="fl header-logo">番茄視訊後臺控制檯</div> <div class="fl header-fold"><a href="javascript:;" title="開啟/關閉左側導航" class="aicon ai-caidan" id="foldSwitch"><i class="layui-icon"></i></a></div> <ul class="layui-nav fl nobg main-nav"> {volist name="menus" id="vo"} {if condition="($i eq 1)"} <li class="layui-nav-item layui-this"> {else /} <li class="layui-nav-item"> {/if} <a href="javascript:;">{$vo['name']}</a></li> {/volist} </ul> <ul class="layui-nav fr nobg head-info" lay-filter=""> <li class="layui-nav-item"> <a href="javascript:void(0);">{$Think.session.USER_INFO_SESSION.au_user_name} </a> <dl class="layui-nav-child"> <dd><a href="javascript:void(0);" id="lockScreen">鎖屏</a></dd> <dd><a href="{:url('login/loginOut')}">退出登陸</a></dd> </dl> </li> <li class="layui-nav-item"><a href="http://www.maccms.com/" target="_blank">官網</a></li> <li class="layui-nav-item"><a href="http://bbs.maccms.com/" target="_blank">論壇</a></li> <li class="layui-nav-item"><a href="__ROOT__/" target="_blank">前臺</a></li> <li class="layui-nav-item"><a href="{:url('index/clear')}" class="j-ajax" refresh="yes">清快取</a></li> </ul> </div> <div class="layui-side layui-bg-black" id="switchNav"> <div class="layui-side-scroll"> {volist name="menus" id="v"} {if condition="($i eq 1)"} <ul class="layui-nav layui-nav-tree"> {else /} <ul class="layui-nav layui-nav-tree" style="display:none;"> {/if} <li class="layui-nav-item layui-nav-itemed"> <a href="javascript:;"><i ></i>{$v['name']}<span class="layui-nav-more"></span></a> <dl class="layui-nav-child"> {volist name="v['sub']" id="vv" key="kk"} <dd><a class="admin-nav-item" data-id="{$key}{$kk}" href="{$vv['url']}"><i ></i> {$vv['name']}</a></dd> {/volist} </dl> </li> </ul> {/volist} </div> </div> <div class="layui-body" id="switchBody"> <div class="layui-tab layui-tab-card" lay-filter="macTab" lay-allowClose="true"> <ul class="layui-tab-title"> <li lay-id="111" class="layui-this">歡迎頁面</li> </ul> <div class="layui-tab-content"> <div class="layui-tab-item layui-show"> <iframe lay-id="111" src="{:url('index/welcome')}" width="100%" height="100%" frameborder="0" scrolling="yes" class="hs-iframe"></iframe> </div> </div> </div> </div> <div class="layui-footer footer"> <div class="fl"></div> <div class="fr"> © 2008-2018 <a href="http://www.maccms.com/" target="_blank">MacCMS.COM.</a> All Rights Reserved.</div> </div> </div> {include file="../../../application/admin/view/public/foot" /} <!--請在下方寫此頁面業務相關的指令碼--> <script> window.localStorage.clear(); var LAYUI_OFFSET = 60; </script> <script type="text/javascript"> layui.use(['element', 'layer'], function() { var $ = layui.jquery, element = layui.element, layer = layui.layer; $('.layui-tab-content').height($(window).height() - 145); var tab = { add: function(title, url, id) { element.tabAdd('macTab', { title: title, content: '<iframe width="100%" height="100%" lay-id="'+id+'" frameborder="0" src="'+url+'" scrolling="yes" class="x-iframe"></iframe>', id: id }); }, change: function(id) { element.tabChange('macTab', id); } }; $('.admin-nav-item').click(function(event) { var that = $(this); var id = that.attr('data-id'); if ($('iframe[lay-id="'+id+'"]')[0]) { tab.change(id); event.stopPropagation(); $("iframe[lay-id='"+id+"']")[0].contentWindow.location.reload(true);//切換後重新整理框架 return false; } if ($('iframe').length == 10) { layer.msg('最多可開啟10個標籤頁'); return false; } that.css({color:'#fff'}); tab.add(that.text(), that.attr('href'), that.attr('data-id')); tab.change(that.attr('data-id')); event.stopPropagation(); return false; }); $(document).on('click', '.layui-tab-close', function() { $('.layui-nav-child a[data-id="'+$(this).parent('li').attr('lay-id')+'"]').css({color:'rgba(255,255,255,.7)'}); }); }); </script> </body> </html>
這是效果圖
下來我們開始寫控制器:
在寫許可權之前,我們先縷縷思路
1.我們需要在使用者登入的時候獲取使用者的所有的許可權
2.過濾系統管理員,不判斷其許可權
3.根據登入時的角色資訊,來驗證許可權
下來我們先看登入儲存使用者許可權資訊:
這個時候我們需要在base基類裡邊做許可權驗證
這裡使用的是tp5獲取的控制器和方法名,這裡有一個注意點就是需要將所有的地址全部轉為小寫,這一步就是判斷使用者是否有許可權,有許可權了會繼續執行,沒有許可權的話,會直接返回上一個頁面
public function check_auth($controller,$action) { $c = strtolower($controller); $a = strtolower($action); // 獲取使用者許可權 $authId = $this->session->getUserRole(); // 獲取使用者資訊 $adminData = $this->session->getUserInfo(); $adminAuth = Db::name('auth')->where('a_id',$authId)->value('a_auth'); $auths = $adminAuth . ',index/index,index/welcome,'; $cur = $c.'/'.$a; if($adminData->au_id =='1'){ return true; } elseif(strpos(strtolower($auths),$cur)===false){ return false; } else{ return true; } }
做到這裡是不是感覺程式碼就到這完了,其實不然,我們還需要寫選單欄的程式碼,因為設定許可權了以後,會有一部分導航是看不見的
這個功能點,我們在哪裡做呢!我們都是知道Layui這個框架是是使用的ifaram,所以導航欄只會重新整理一次,所以我們需要在index控制寫
這個方法的註釋已經寫得很明晰了。我簡單的解釋一下
首先我們會從配置檔案中將所有的許可權都讀取出來,然後進行迴圈組裝跟移除此使用者沒有許可權的導航。
show為1的是顯示的導航列表,我們獲取到配置檔案的許可權資訊,組裝成我們資料庫儲存的格式
然後拿著這個控制器跟方法名來使用我們base的檢驗許可權的方法,來移除不屬於角色的許可權,這就是第一個if做的事情
我們的模組有增刪改這三個功能,當然我們的許可權控制也是需要控制這些列表的。但是這些列表是不會顯示出來的,所以我們會將show為0的所有列表刪除掉
這個時候我們的大的導航欄在許可權過濾完之後是由一部分是空的,所以在將這一部分刪除即可
/**
* 獲取選單
* @return array
*/
public function getMenu()
{
$menus = Config::get('auth');
foreach($menus as $k1=>$v1){
foreach($v1['sub'] as $k2=>$v2){
// 獲取所有的一級選單
if($v2['show'] == 1) {
$url = url( 'admin/'.$v2['controller'] . '/' . $v2['action']);
if ($this->check_auth($v2['controller'], $v2['action'])) {
$menus[$k1]['sub'][$k2]['url'] = $url;
} else {
// 沒有許可權的全部刪除
unset($menus[$k1]['sub'][$k2]);
}
}
else{
// 不顯示的不需要給組裝url
unset($menus[$k1]['sub'][$k2]);
}
}
// 在將許可權過濾完之後,沒有許可權的一級就沒有二級,所以刪除區級即可
if(empty($menus[$k1]['sub'])){
unset($menus[$k1]);
}
}
return $menus;
}
我們許可權儲存的方式
<?php
return array(
'1' => array('name' => '首頁', 'icon' => 'xe625', 'sub' => array(
'11' => array("show"=>1,"name" => '歡迎頁面', 'controller' => 'index', 'action' => 'welcome'),
'12' => array("show"=>1,"name" => '系統配置', 'controller' => 'index', 'action' => 'welcome'),
)),
'11' => array('name' => '管理員', 'icon' => 'xe62c', 'sub' => array(
'114' => array("show"=>1,'name' => '管理員', 'controller' => 'Administrators', 'action' => 'index'),
'63' => array("show"=>1,'name' => '管理員許可權組', 'controller' => 'Auth', 'action' => 'index'),
'115' => array("show"=>1,'name' => '管理員操作日誌', 'controller' => 'userTask', 'action' => 'index'),
)),
'3' => array('name' => '基礎', 'icon' => 'xe62c', 'sub' => array(
'26' => array("show"=>1,'name' => '啟動和引導頁', 'controller' => 'boot', 'action' => 'index'),
'261' => array("show"=>0,'name' => '啟動頁新增', 'controller' => 'boot', 'action' => 'addBootUp'),
'262' => array("show"=>0,'name' => '啟動頁修改', 'controller' => 'boot', 'action' => 'editBootUp'),
'263' => array("show"=>0,'name' => '啟動頁刪除', 'controller' => 'boot', 'action' => 'delBootUp'),
'264' => array("show"=>0,'name' => '啟動頁狀態', 'controller' => 'boot', 'action' => 'bootUpStatus'),
'31' => array("show"=>1,'name' => '廣告管理', 'controller' => 'ad', 'action' => 'index'),
'311' => array("show"=>0,'name' => '廣告新增', 'controller' => 'ad', 'action' => 'addBanner'),
'312' => array("show"=>0,'name' => '廣告修改', 'controller' => 'ad', 'action' => 'editBanner'),
'313' => array("show"=>0,'name' => '廣告刪除', 'controller' => 'ad', 'action' => 'delBanner'),
'314' => array("show"=>0,'name' => '廣告視訊', 'controller' => 'ad', 'action' => 'videoInfoList'),
'30' => array("show"=>1,'name' => '域名管理', 'controller' => 'domain', 'action' => 'index'),
'301' => array("show"=>0,'name' => '域名新增', 'controller' => 'domain', 'action' => 'addDomain'),
'302' => array("show"=>0,'name' => '域名修改', 'controller' => 'domain', 'action' => 'editDomain'),
'303' => array("show"=>0,'name' => '域名刪除', 'controller' => 'domain', 'action' => 'delDoamin'),
'34' => array("show"=>1,'name' => '使用者影象庫', 'controller' => 'headpic', 'action' => 'index'),
'341' => array("show"=>0,'name' => '使用者影象庫新增', 'controller' => 'headpic', 'action' => 'add'),
'342' => array("show"=>0,'name' => '使用者影象庫修改', 'controller' => 'headpic', 'action' => 'edit'),
'343' => array("show"=>0,'name' => '使用者影象庫刪除', 'controller' => 'headpic', 'action' => 'del'),
'32' => array("show"=>1,'name' => '公告管理', 'controller' => 'domain', 'action' => 'index'),
'33' => array("show"=>1,'name' => '系統訊息', 'controller' => 'domain', 'action' => 'index'),
'27' => array("show"=>1,'name' => '版本更新', 'controller' => 'Versions', 'action' => 'index'),
'2701' => array("show"=>0,'name' => '--版本修改', 'controller' => 'Versions', 'action' => 'editVersions'),
'2703' => array("show"=>0,'name' => '--版本刪除', 'controller' => 'Versions', 'action' => 'delVersions'),
'2704' => array("show"=>0,'name' => '--版本新增', 'controller' => 'Versions', 'action' => 'addVersions'),
)),
'4' => array('name' => '視訊', 'icon' => 'xe625', 'sub' => array(
'31' => array("show"=>1,'name' => '型別管理', 'controller' => 'videoType', 'action' => 'index'),
'311' => array("show"=>0,'name' => '修改型別', 'controller' => 'videoType', 'action' => 'editType'),
'312' => array("show"=>0,'name' => '刪除型別', 'controller' => 'videoType', 'action' => 'delVideoType'),
'313' => array("show"=>0,'name' => '新增型別', 'controller' => 'videoType', 'action' => 'addVideoType'),
'314' => array("show"=>0,'name' => '一級分類管理', 'controller' => 'videoType', 'action' => 'subclassList'),
'315' => array("show"=>0,'name' => '一級分類修改', 'controller' => 'videoType', 'action' => 'editSubClass'),
'316' => array("show"=>0,'name' => '一級分類新增', 'controller' => 'videoType', 'action' => 'addSubclass'),
'317' => array("show"=>0,'name' => '一級分類刪除', 'controller' => 'videoType', 'action' => 'delSubclass'),
'318' => array("show"=>0,'name' => '二級分類管理', 'controller' => 'videoType', 'action' => 'secondTypeIndex'),
'319' => array("show"=>0,'name' => '新增二級分類', 'controller' => 'videoType', 'action' => 'addSecondType'),
'3110' => array("show"=>0,'name' => '修改二級分類', 'controller' => 'videoType', 'action' => 'editSecondType'),
'32' => array("show"=>1,'name' => '專題管理', 'controller' => 'subject', 'action' => 'index'),
'321' => array("show"=>0,'name' => '專題列表', 'controller' => 'subject', 'action' => 'subjectList'),
'322' => array("show"=>0,'name' => '專題修改', 'controller' => 'subject', 'action' => 'editSubject'),
'323' => array("show"=>0,'name' => '專題新增', 'controller' => 'subject', 'action' => 'addSubject'),
'324' => array("show"=>0,'name' => '專題刪除', 'controller' => 'subject', 'action' => 'delSubject'),
'325' => array("show"=>0,'name' => '專題視訊列表', 'controller' => 'subject', 'action' => 'videoList'),
'326' => array("show"=>0,'name' => '專題視訊新增', 'controller' => 'subject', 'action' => 'subjectVideoAdd'),
'327' => array("show"=>0,'name' => '專題視訊刪除', 'controller' => 'subject', 'action' => 'delSubjectVideo'),
'328' => array("show"=>0,'name' => '專題視訊更換', 'controller' => 'subject', 'action' => 'editSubjectVideo'),
'329' => array("show"=>0,'name' => '專題廣告列表', 'controller' => 'subject', 'action' => 'adList'),
'3210' => array("show"=>0,'name' => '專題廣告新增', 'controller' => 'subject', 'action' => 'addAd'),
'3211' => array("show"=>0,'name' => '專題廣告修改', 'controller' => 'subject', 'action' => 'editAd'),
'3212' => array("show"=>0,'name' => '專題廣告刪除', 'controller' => 'subject', 'action' => 'delAd'),
'40' => array("show"=>1,'name' => '標籤庫', 'controller' => 'tag', 'action' => 'index'),
'401' => array("show"=>0,'name' => '標籤新增', 'controller' => 'tag', 'action' => 'add'),
'402' => array("show"=>0,'name' => '標籤修改', 'controller' => 'tag', 'action' => 'edit'),
'403' => array("show"=>0,'name' => '標籤刪除', 'controller' => 'tag', 'action' => 'del'),
'41' => array("show"=>1,'name' => '熱詞管理', 'controller' => 'hotWord', 'action' => 'index'),
'411' => array("show"=>0,'name' => '熱詞新增', 'controller' => 'hotWord', 'action' => 'add'),
'412' => array("show"=>0,'name' => '熱詞修改', 'controller' => 'hotWord', 'action' => 'edit'),
'413' => array("show"=>0,'name' => '熱詞刪除', 'controller' => 'hotWord', 'action' => 'del'),
'38' => array("show"=>1,'name' => '視訊管理', 'controller' => 'video', 'action' => 'index'),
'381' => array("show"=>0,'name' => '視訊新增', 'controller' => 'video', 'action' => 'add'),
'382' => array("show"=>0,'name' => '視訊修改', 'controller' => 'video', 'action' => 'edit'),
'383' => array("show"=>0,'name' => '視訊刪除', 'controller' => 'video', 'action' => 'del'),
'39' => array("show"=>1,'name' => '評論管理', 'controller' => 'video', 'action' => 'index'),
)),
'6' => array('name' => '使用者', 'icon' => 'xe62c', 'sub' => array(
'63' => array("show"=>1,'name' => '使用者管理', 'controller' => 'user', 'action' => 'index'),
'6301' => array("show"=>0,'name' => '--會員資訊檢視', 'controller' => 'user', 'action' => 'userView'),
'6302' => array("show"=>0,'name' => '--會員刪除', 'controller' => 'user', 'action' => 'delUser'),
'6303' => array("show"=>0,'name' => '--會員資訊修改', 'controller' => 'user', 'action' => 'editUser'),
'64' => array("show"=>1,'name' => '任務記錄', 'controller' => 'userTask', 'action' => 'index'),
'6401' => array("show"=>0,'name' => '使用者任務刪除', 'controller' => 'userTask', 'action' => 'delUserTask'),
'65' => array("show"=>1,'name' => '特權兌換記錄', 'controller' => 'userExchange', 'action' => 'index'),
'6501' => array("show"=>0,'name' => '使用者任務刪除', 'controller' => 'userTask', 'action' => 'delUserTask'),
// '67' => array("show"=>1,'name' => '視訊播放記錄', 'controller' => 'user', 'action' => 'index'),
// '68' => array("show"=>1,'name' => '視訊收藏記錄', 'controller' => 'user', 'action' => 'index'),
'66' => array("show"=>1,'name' => 'App下載記錄', 'controller' => 'user', 'action' => 'index'),
'69' => array("show"=>1,'name' => '使用者反饋', 'controller' => 'user', 'action' => 'index'),
)),
'5' => array('name' => '推廣', 'icon' => 'xe616', 'sub' => array(
'28' => array("show"=>1,'name' => '任務配置', 'controller' => 'task', 'action' => 'index'),
'2801' => array("show"=>0,'name' => '--任務修改', 'controller' => 'task', 'action' => 'editTask'),
'2803' => array("show"=>0,'name' => '--任務刪除', 'controller' => 'task', 'action' => 'delTask'),
'2804' => array("show"=>0,'name' => '--任務新增', 'controller' => 'task', 'action' => 'addTask'),
'26' => array("show"=>1,'name' => '特權配置', 'controller' => 'Exchange', 'action' => 'index'),
'2601' => array("show"=>0,'name' => '特權修改', 'controller' => 'Exchange', 'action' => 'addExchange'),
'2603' => array("show"=>0,'name' => '特權刪除', 'controller' => 'Exchange', 'action' => 'editExchange'),
'2604' => array("show"=>0,'name' => '特權新增', 'controller' => 'Exchange', 'action' => 'delExchange'),
'29' => array("show"=>1,'name' => '等級配置', 'controller' => 'task', 'action' => 'index'),
)),
// '9' => array('name' => '採集', 'icon' => 'xe727', 'sub' => array(
// '91' => array("show"=>1,'name' => '聯盟資源庫', 'controller' => 'collect', 'action' => 'union'),
// '9101' => array("show"=>0,'name' => '--採集入口', 'controller' => 'collect', 'action' => 'api'),
// '9102' => array("show"=>0,'name' => '--斷點採集', 'controller' => 'collect', 'action' => 'load'),
// '9103' => array("show"=>0,'name' => '--繫結分類', 'controller' => 'collect', 'action' => 'bind'),
// '9104' => array("show"=>0,'name' => '--採集視訊', 'controller' => 'collect', 'action' => 'vod'),
// '9105' => array("show"=>0,'name' => '--採集文章', 'controller' => 'collect', 'action' => 'art'),
//
// '92' => array("show"=>1,'name' => '定時掛機採集', 'controller' => 'collect', 'action' => 'timing'),
//
// '93' => array("show"=>1,'name' => '自定義資源庫', 'controller' => 'collect', 'action' => 'index'),
// '9301' => array("show"=>0,'name' => '--自定義資源庫資訊維護', 'controller' => 'collect', 'action' => 'info'),
// '9302' => array("show"=>0,'name' => '--自定義資源庫刪除', 'controller' => 'collect', 'action' => 'del'),
//
// '94' => array("show"=>1,'name' => '自定義採集', 'controller' => 'cj', 'action' => 'index'),
// '9401' => array("show"=>0,'name' => '--自定義採集資訊維護', 'controller' => 'cj', 'action' => 'info'),
// '9402' => array("show"=>0,'name' => '--自定義採集刪除', 'controller' => 'cj', 'action' => 'del'),
// '9403' => array("show"=>0,'name' => '--自定義採集釋出方案', 'controller' => 'cj', 'action' => 'program'),
// '9404' => array("show"=>0,'name' => '--自定義採集採集網址', 'controller' => 'cj', 'action' => 'col_url'),
// '9405' => array("show"=>0,'name' => '--自定義採集採集內容', 'controller' => 'cj', 'action' => 'col_content'),
// '9406' => array("show"=>0,'name' => '--自定義採集釋出內容', 'controller' => 'cj', 'action' => 'publish'),
// '9407' => array("show"=>0,'name' => '--自定義採集匯出', 'controller' => 'cj', 'action' => 'export'),
// '9408' => array("show"=>0,'name' => '--自定義採集匯入', 'controller' => 'cj', 'action' => 'import'),
//
// )),
// '10' => array('name' => '資料庫', 'icon' => 'xe621', 'sub' => array(
// '101' => array("show"=>1,'name' => '資料庫管理', 'controller' => 'database', 'action' => 'index'),
// '10001' => array("show"=>0,'name' => '--資料庫備份', 'controller' => 'database', 'action' => 'export'),
// '10002' => array("show"=>0,'name' => '--資料庫還原', 'controller' => 'database', 'action' => 'import'),
// '10003' => array("show"=>0,'name' => '--資料庫優化', 'controller' => 'database', 'action' => 'optimize'),
// '10004' => array("show"=>0,'name' => '--資料庫修復', 'controller' => 'database', 'action' => 'repair'),
// '10005' => array("show"=>0,'name' => '--資料庫刪除備份', 'controller' => 'database', 'action' => 'del'),
// '10006' => array("show"=>0,'name' => '--資料庫表資訊', 'controller' => 'database', 'action' => 'columns'),
//
// '102' => array("show"=>1,'name' => '執行SQL語句', 'controller' => 'database', 'action' => 'sql'),
// '103' => array("show"=>1,'name' => '資料批量替換', 'controller' => 'database', 'action' => 'rep'),
// )),
);