防跳墙访问

出现场景:

 

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.mzph.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:…