检验用户是否有权使用某功能的织梦函数TestPurview
不知道你用的是哪个版本的织梦,你可以看下留言板那个模板页面的header部分引用的是哪个文件是headhtm还是其他的,改变对应网页的排版应该就能实现了,很久没有弄过织梦了,有些已经忘记了,希望能够帮到你
dedecms模板更换方法一将新模板覆盖templets下的文件最简单的更换模板的方法是直接覆盖templets目录下的所有文件,但是这样会导致原先的模板被覆盖。dedecms模板更换方法二通过后台管理,使DEDECMS去寻找模板目录还有一种就是更换整个网站的模板目录。系统管理 -- 站点设置 -- 默认模板风格 设置为目录名字比如下载了一个新的模板,新模板目录为newtemplet那么设置为 /newtemlet/default 这样基本模块的模板就会去该目录下寻找。dedecms模板更换方法三修改特定页面的模板还有就是修改单独网页的模板,那么就去频道管理 -- 网站栏目管理 -- 高级选项里选定模板地址充分利用 / 这样的上级目录跳转到模板的目录下。dedecms模板更换方法四修改源代码改变模板目录发现另一种方法,更为直接:修改include目录下的config_basephp下找到$cfg_templets_dir = $cfg_cmspath'/templets';只需要把这个修改为新的目录名字,然后HTML更新一下,所有的模板风格都改变了。这种方法不推荐,不过你要是为了防止模板被盗到可以还有个方法:把新模板直接上传到templets/default目录里,然后再点击栏目管理,在栏目高级参数那里选择新模板。
函数TestPurview($n)虽然,看上去只是一个相对比较简单的函数,但是这个函数是非常非常重要的,试想一下如果一个系统中没有检验某个用
户是否有权限操作某些功能的话,那么,这个系统一定非常危险,因为,随便一个人都可以操作某个功能,例如,进入后台,删除栏目,删除数据库等,就如同一个
家四周都没有墙一样,随便什么人都可以进入,这样的家完全就是公共场合,完全没有什么安全可言,一个系统也是如此。
所以,检测系统函数就比较重要了,当然,光这个一个函数还不够,不光要检验用户的使用权限,还要检验用户密码,是不是管理员,甚至是用户登录ip等,都要检验一下,这样才可以称得上安全的系统。
本函数在“管理员登陆类”userloginclassphp里面的第一个函数就是它,返回的值是true或false,若有权限则返回trure否则返回false。
通过教程“织梦中cookie和session的应用”我们知道了,当我们登录后台后,织梦系统会把登录的用户信息写入session里面,并把session存放在/data/session文件夹里面。
因为不同的用户登录后台,产生的session是不一样的,我就在后台注册一个发布员,用户名为fby。并且,在后台定义“信息发布员”的权限如下图所示。
登录/注册后可看大图
我整理了一下“信息发布员”的权限如下:
列出授权栏目(t_AccList)
发布授权文档(a_AccNew)
列出授权文档(a_AccList)
列出我发布的文档(a_MyList)
修改我发布的文档(a_MyEdit)
删除我发布的文档(a_MyDel)
更改个人密码(sys_MdPwd)
评论管理(sys_Feedback)
管理我的上传(sys_MyUpload)
当我用fby用户名登录后,在data/session/文件夹里面,生成一个名为sess_3vtlqpg0pnlmc63pd5ai86gl16 的 session 。这个session里面的内容如下所示。
securimage_code_value|s:4:"npll";
dede_admin_id|s:1:"8";
dede_admin_type|s:1:"1";
dede_admin_channel|s:0:"";
dede_admin_name|s:3:"fby";
<font color="Blue">dede_admin_purview|s:107:"t_AccList
a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd sys_Feedback
sys_MyUpload plus_留言簿模块 ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
如果我们以超级管理员,也就是最高级别的身份登录后台后,我们同样得到类似的如下内容。
securimage_code_value|s:4:"2gsf";
dede_admin_id|s:1:"1";
dede_admin_type|s:2:"10";
dede_admin_channel|s:1:"0";
dede_admin_name|s:5:"admin";
<font color="Blue">dede_admin_purview|s:15:"admin_AllowAll ";</font>
dede_admin_style|s:10:"newdedecms";
复制代码
当登录后,这些是如何生成的?这个我们在上面提到了,以前的教程已经详细讲解了,其实,就是通过“管理员登陆类”userloginclassphp里面的函数来实现的,当然,不只是这个文件。
我们分析上面这些,完全就是为了函数TestPurview($n)作准备的,好了,现在我们来分析一下这个用户权限检验函数。
函数:
function TestPurview($n)
{
$rs = FALSE;
$purview = $GLOBALS['cuserLogin']->getPurview();
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
if($n=='')
{
return TRUE;
}
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
$ns = explode(',',$n);
foreach($ns as $n)
{
//只要找到一个匹配的权限,即可认为用户有权访问此页面
if($n=='')
{
continue;
}
if(in_array($n,$GLOBALS['groupRanks']))
{
$rs = TRUE; break;
}
}
return $rs;
}
复制代码
通过getPurview()方法,我们从session得到了dede_admin_purview里面的值,因
为,$GLOBALS['cuserLogin']是实例化“登录类”的对像,而这个登录类的构造函数,在我们实例化时,已经把session里面的值赋
给了$this->userPurview,代码如下所示。
$this->userID = $_SESSION[$this->keepUserIDTag];
$this->userType = $_SESSION[$this->keepUserTypeTag];
$this->userChannel = $_SESSION[$this->keepUserChannelTag];
$this->userName = $_SESSION[$this->keepUserNameTag];
$this->userPurview = $_SESSION[$this->keepUserPurviewTag];
$this->adminStyle = $_SESSION[$this->keepAdminStyleTag];
复制代码
从上面代码我们就不难发现$this->userPurview=$_SESSION['dede_admin_purview'],即
t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值,明白了这一点,这个TestPurview($n)就简单多了。
1、条件判断:
if(preg_match('/admin_AllowAll/i',$purview))
{
return TRUE;
}
复制代码
如果我们用的是管理员登录,那么,$_SESSION['dede_admin_purview']的值等于admin_AllowAll,返回true,所以,这句代码就是判断是不是管理登录。
2、条件判断
if($n=='')
{
return TRUE;
}
复制代码
若参数为空,直接返回true,也就是说,只要不提供功能参数,就认为是可以操作的,所以,这一点要注意了,如果你不小心,忘记写参数,那么,很可能本想过虑掉的用户结果没有过虑掉,这是非常危险的,所以,这个最好有个提示,有个对话框,这样可以提醒管理员。
3、把登录的后台的用户的权限,例如,本例子中的“信息发布员”权限$_SESSION['dede_admin_purview'],转换成数组存放到全局变量$GLOBALS['groupRanks']里面,以备下面之用。
if(!isset($GLOBALS['groupRanks']))
{
$GLOBALS['groupRanks'] = explode(' ',$purview);
}
复制代码
4、把功能参数转换成数组:$ns = explode(',',$n);
5、遍历:foreach($ns as
$n),就是把传递过来的功能参数,通过in_array($n,$GLOBALS['groupRanks'])这个函数进行对比,看一下$n里面的有
没有存功能在数组$_SESSION['dede_admin_purview']里面。例如:本例子信息发布员的权限在上我们已经知道了
有:t_AccList a_AccNew a_AccList a_MyList a_MyEdit a_MyDel sys_MdPwd
sys_Feedback sys_MyUpload plus_留言簿模块这些值。
如果$n是:a_AccNew,t_New,经过上面一个遍历,我们发现,其中a_AccNew在数
组$GLOBALS['groupRanks'],函数立马跳出来,返回一个true,也就是说织梦的这个函数,只要$n里面有一个是
与$GLOBALS['groupRanks']里面的值一样,
就可以操作这个页面。而不需要全部都在$GLOBALS['groupRanks']里面才可以操作这个页面。
当然,你可以根据自己需要,直接严格匹配,只有全部都在登录用户的权限里面才可以操作页面。这个功能也简单,只要作如下更改:
if(!in_array($n,$GLOBALS['groupRanks']))
{
$rs = FALSE; break;
}
复制代码
也就是把$n参数里面的值判断一下,只要有一个不在登录用户的权限里面,就返回false,退出操作。
#1062 - Duplicate entry '1' for key 'PRIMARY'
这个错误说的是。rank主键重复。 及dede_admintype表中已经存在了一个 rank等于1的记录了。
把它删了重新插入就好了。
====
CONCAT_WS( "-", ) = ""
这个字段肯定写错了。 到表中确认一下。
验证码是你在后台php文件里面设置关闭了,打开方式参照“http://jingyanbaiducom/article/6fb756eca34d60241858fb94html”-怎么关闭就怎么打开。
看到提交留言了,在“核心”-“频道模型”-“自定义表单”里面。
因为别人发布的留言需要审核通过才会在前台页面显示,所以你需要去审核,或者你可以修改成不要审核也能显示
0条评论