防跳墻訪問

出現場景:

?

1. 沒有登錄,也能訪問網頁

2. 沒有相關權限,也能訪問對應的控制器和方法

?

解決方案:

?

定義一個CommonController,其他控制器繼承CommonController,在CommonController中定義初始化方法_initialize

注:這里用的是tp3.2框架,如果我們直接在CommonController中定義__constrct構造方法,會造成重寫Controller,所以我們直接使用_initialize方法(_initialize方法是tp框架的初始化方法)

注:也可以parent::__construct();[tp框架中推薦用_initalize方法,如果是其他框架或是原生,可以用parent::__construct()]

?

具體實施:

?

1. 解決沒有登錄也可以訪問網頁

?

<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller {Public function _initialize(){// 初始化的時候檢查用戶權限if(!isset($_SESSION['username']) || $_SESSION['username']==''){$this->redirect('Login/login');}}
}
?>

核心思想: 判斷是否有session

?

2. ?解決沒有相關權限,也能訪問對應的控制器和方法

?

核心思想:

(1) 從session中獲取當前訪問的角色id role_id

(2) 根據role_id從role表中查詢role_auth_path的值(role_auth_path記錄了當前角色所有能夠訪問的控制器-方法字符串)

(3) 獲取當前訪問的控制器-方法字符串,和當前角色的role_auth_path進行比較,如果當前訪問的控制器-方法在role_auth_path中,則讓其正常訪問, 如果不在,則說明當前角色不具有訪問權限,為跳墻訪問

數據表地址:?http://blog.csdn.net/m_nanle_xiaobudiu/article/details/79443389

?

具體實施:

?

<?php
namespace Home\Controller;
use Think\Controller;class CommonController extends Controller{function _initialize(){//檢測sessionif(!session('?id')){$this->error('您尚未登錄,請登錄后再訪問', U('Index/login'));}//獲取當前訪問的控制器-方法$now_path = CONTROLLER_NAME.'-'.ACTION_NAME;//獲取session中的roleid,從role表中獲取role_auth_path$role_id = session('role_id');$role_info = D('Role')->field("role_auth_path")->find($role_id);$role_auth_path = $role_info['role_auth_path'];//將 role_auth_path 轉為數組$role_auth_path = explode(',', $role_auth_path);//判斷$now_path是否在$role_auth_path中if(!in_array($now_path, $role_auth_path)){//如果不存在,則為跳墻訪問,跳轉回登錄頁$this->error('您無權訪問該模塊,請重新登錄再訪問', U('Index/login'), 3);}}
}

?

備注:

為角色分配權限

?

html部分:

?

角色列表頁面roleList.html

?

<table ><thead><tr><th><input name="" type="checkbox" value="" id="checkAll" /></th><th>編號</th><th>角色名</th><th>權限ids</th><th>權限路徑</th><th>操作</th></tr></thead><tbody><foreach name="role_list" item="vo"><tr><td><input name="" type="checkbox" value="" /></td><td>{$vo.role_id}</td><td>{$vo.role_name}</td><td>{$vo.role_auth_ids}</td><td>{$vo.role_auth_path}</td><td><a href="{:U('distribute', 'role_id='.$vo[role_id])}" class="tablelink">分配權限</a> <a href="#" class="tablelink"> 刪除</a></td></tr></foreach></tbody>
</table>

?

權限列表 distribute.html

?

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>無標題文檔</title><script language="JavaScript" src="__ADMIN__/js/jquery.js"></script>
</head><body><div><form action="" method="post"><input type="hidden" name="role_id" value="{$Think.get.role_id}" />您正在給【<label style="color: red;font-weight: bolder;">{$role_info.role_name}</label>】設置權限<ul><table><thead><tr><th>權限分類</th><th>權限</th></tr></thead><tbody><foreach name="auth_p" item="vo"><tr><td><in name="vo.auth_id" value="$role_info.role_auth_ids"><input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" checked="checked" /><else /><input type="checkbox" name="auth_id[]" value="{$vo.auth_id}" /></in>{$vo.auth_name}</td><td><foreach name="auth_s" item="v"><if condition="$v.auth_pid eq $vo.auth_id "><input type="checkbox" name="auth_id[]" value="{$v.auth_id}"<in name="v.auth_id" value="$role_info.role_auth_ids">checked="checked"</in>>{$v.auth_name}&emsp;</if></foreach></td></tr></foreach></tbody></table><br/><li><label>&nbsp;</label><input name="" id="btnSubmit" type="button" class="btn" value="確認保存" /></li></ul></form></div>
</body><script type="text/javascript">
$(function(){//給btnsubmit綁定點擊事件$('#btnSubmit').on('click',function(){//表單提交$('form').submit();})
});
</script>
</html>

?

php部分: 對應的方法:

?

?

<?php
function distribute(){$role_model = D('Role');if(IS_POST){//1. 接收role_id的值$role_id = I('post.role_id');//1. 接收表單數據$ids = I('post.auth_id');//dump($ids);//2. 將數組轉為字符串$ids = implode(',', $ids);//3. 根據ids從auth表中查詢數據,拼接role_auth_path需要數據$auth_list = D('Auth')->where("auth_id in ($ids)")->select();//dump($auth_list);die;$role_auth_path = '';foreach($auth_list as $value){if($value['auth_c'] != ''){$role_auth_path .= $value['auth_c'].'-'.$value['auth_a'].',';}}//去掉最后一個 ,$role_auth_path = rtrim($role_auth_path, ',');//4. 構造修改數據$save_data = array('role_id' => $role_id,'role_auth_ids' => $ids,'role_auth_path' => $role_auth_path);if($role_model->save($save_data)){$this->success('分配權限成功', U('roleList'), 3);} else {$this->error('分配權限失敗', U('roleList'), 3);}} else {//1.接收角色id$role_id = I('get.role_id');//2. 根據角色id查詢角色信息$role_info = $role_model->find($role_id);//3. 分配到模板$this->assign('role_info', $role_info);//4. 分一二級讀取auth表中的權限信息$auth_model = D('Auth');$auth_p = $auth_model->where('auth_pid=0')->select();$auth_s = $auth_model->where('auth_pid!=0')->select();$this->assign('auth_p', $auth_p);$this->assign('auth_s', $auth_s);$this->display();}}?>

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

windows編譯libevent時報告“缺少print_winsock_errors.obj”的解決

一、綜述 Libevent 是一個用C語言編寫的、輕量級的開源高性能事件通知庫。 在libevent官網(http://libevent.org)下載源碼包&#xff0c;在Windows平臺編譯時&#xff0c;會報缺少“print_winsock_errors.obj”的錯誤。 二、原因及解決 經檢查&#xff0c;這是因為源碼包中缺少…

7.python之正則表達式re模塊

一.正則表達式中常用元字符的復習。通配符系列.(點)匹配任意一個除換行符以外的字符。*(星號)用來匹配*星號前面的字符或者一組字符0到無窮次。可以寫為0(加號)匹配加號前面的一個字符或者一組字符1到無窮次。可以寫為1?(問號)匹配問號前面的一個字符或者一組字符0到1次。可以…

C# WPF開源控件庫HandyControl用法舉例

概述HandyControl是一款免費開源的WPF控件庫&#xff0c;Github可以獲取到源代碼&#xff0c;相關的示例代碼也在github上能獲取到&#xff0c;但是沒有詳細的中文說明文檔&#xff0c;對于新手而言使用起來還是會有一些困擾&#xff0c;網上也很難搜到相關的用法示例&#xff…

nginx服務器,訪問時顯示目錄,不直接顯示index.php

一、效果 二、解決方案 修改網站配置文件&#xff0c;添加如下代碼&#xff1a; autoindex on; autoindex_exact_size off; autoindex_localtime on; 修改后的網站配置文件如下&#xff1a; server {listen 80;server_name test.haveyb.com;charset utf-8;error_log …

復選框checked 選中后不顯示打鉤

復選框checked 選中后不顯示打鉤 checkbox屬性checked"checked"已有&#xff0c;但復選框卻不顯示打鉤的原因 復選框綁定了click事件&#xff0c;點一次選中&#xff0c;再點擊取消選中&#xff0c; 第一次&#xff0c;可以正常顯示選中和取消&#xff0c;但當再去選…

dotnet7 aot編譯實戰

原文地址&#xff1a;https://www.cnblogs.com/kewei/p/16722674.html0 起因這段日子看到dotnet7-rc1發布&#xff0c;我對NativeAot功能比較感興趣&#xff0c;如果aot成功&#xff0c;這意味了我們的dotnet程序在防破解的上直接指數級提高。我隨手使用asp.netcore-7.0模板創建…

實現ModelDriver接口的功能(轉)

ModelDriver接口 來自com.opensymphony.xwork2.ModelDriven。是xwork-2.1.2-750.jar包的東西。 下面是源碼&#xff1a; package com.opensymphony.xwork2; public abstract interface ModelDriven<T> { public abstract T getModel(); } 該接口只有一個getModel()方法…

Git的使用(推薦命令行模式)

一 使用 git版本控制已經逐漸取代cvs,svn等版本控制,對于一名程序員來說,使用git同樣是一門必備的功課.1. 倉庫初始化查看文件.如果有.git文件夾,說明創建本地倉庫成功(.git是隱藏文件夾)2. 修改用戶名和郵箱本地配置:注: 在全局配置與本地配置都存在用戶名時,本地配置優先級更…

.NET MAUI 環境配置技巧

關于 .NET MAUI 國內?伙伴在配置 .NET MAUI 的時候&#xff0c;遇到不少問題。希望通過本教程&#xff0c;給到大家?些指引。01基礎組件部分.NET SDK 安裝建議安裝最新的 .NET SDK下載地址 https://dotnet.microsoft.com/download/dotnet/6.0安裝 .NET MAUI安裝 .NET MAUI 成…

Linux中一些常用的很巧妙的命令

當你想要使用上一個命令的最后一個參數&#xff0c;&#xff08;上一個命令的最后一個參數很長&#xff09;&#xff0c;可以使用 esc .      (是esc 點&#xff09; !$ 引用上一個命令的最后一個參數 對命令行的編輯快捷方式&#xff1a; Ctr…

android 8種對話框(Dialog)使用方法匯總

本文為作者原創&#xff0c;轉載請注明出處&#xff1a;http://www.cnblogs.com/gzdaijie/p/5222191.html 目錄 1.寫在前面2.代碼示例2.1 普通Dialog&#xff08;圖1與圖2&#xff09;2.2 列表Dialog&#xff08;圖3&#xff09;2.3 單選Dialog&#xff08;圖4&#xff09;2.4 …

使用layui的layer組件做彈出層

官方文檔地址: http://www.layui.com/doc/modules/layer.html 本例演示效果: 當點擊申請提現時,出現申請提現框,并根據用戶輸入進行一些判斷,給出友好提示,比如: 代碼實現: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

C#之表達式樹使用

目的遇到一個場景需要接收一個表的列來進行動態排序&#xff0c;比如我想根據CreateTime進行正序排序&#xff0c;加上我使用的ORM框架是EFCore&#xff0c;那么我一下子就想到應該使用OrderBy&#xff0c;然后接收一個要排序的列query.OrderBy("CreateTime")但是這樣…

實現一個基于相等性比較的 GroupBy

實現一個基于相等性比較的 GroupByIntro在我們的系統里有些數據可能會有問題&#xff0c;數據源頭不在我們這里&#xff0c;數據不好修復&#xff0c;在做 GroupBy 的時候就會很痛苦&#xff0c;默認的 group by 會依賴于 HashCode &#xff0c;而某些場景下 HashCode 可能并不…

win7系統下載 ghost win7 Sp1 64位純凈3月版

win7系統下載 ghost win7 Sp1 64位純凈3月版 軟件名稱: Ghost Win7 Sp1 64位純凈3月版軟件語言: 簡體中文軟件大小: 5.25大小: GB發布日期: 2017-03-21文件名稱: ZJY_Ghost_win 7_X64_CJ201703.GHOM D 5: EB16DCD608A5CCFE34B58…

CrossPHP框架的常用操作

1. 在視圖控制器中使用$this->res()方法來生成資源文件的絕對路徑$this->res(css/style.css);生成的連接為http://youdomain.com/static/css/style.css2. 生成指定app名稱的連接$this->appUrl()第一個參數為基礎url, 第二個參數為app名稱, 第三個參數為 控制器:方法 第…

WPF-07 Style之觸發器

觸發器能夠在改變屬性值的時候&#xff0c;根據值變化執行操作&#xff0c;在不需要創建一個新的控件的情況下&#xff0c;可以動態的改變控件的外觀&#xff0c;當條件滿足時&#xff0c;觸發器可以改變任何屬性的值&#xff0c;觸發器通常定義在Style中&#xff0c;在窗體的根…

jdk自帶常用命令行工具使用

轉自&#xff1a;http://blog.csdn.net/winwill2012/article/details/46364923jps命令使用jps命令類似于Linux下的ps命令&#xff0c;用于列出當前正在運行的所有Java進程。基本用法直接運行不加任何參數就能列出所有java進程的pid和類的短名稱。例如&#xff1a;常用參數-q參數…

crossphp框架中,在模板中加載其他模板

這里說我自己做的項目的應用場景 要求是用layui框架的layer組件,實現彈出層效果,用原聲PHP無疑很容易做到,但是如果應用到crossphp框架流程就會非常麻煩 這里簡單講一下大致的步驟: 1. 在一個模板文件中應用layui的layer組件實現彈出框 index.tpl.php2. 從我們自己定義的路徑上…

for(auto c:s)與for(auto c:s)

在c11標準下可以執行的特殊格式的for循環語句&#xff0c;區別在于引用類型可以改變原來的值 #include<iostream> using namespace std; int main() {string s("hello world");for(auto c:s)ct;cout<<s<<endl;//結果為hello worldfor(auto &c:…