希望大家能沟互相学习,互相进步,请各位大神都不要吝啬能够提供更多的示例给大家参考。。。。
本源码是通过视频教程理解,然后自己写出来的(所以说是非原创),可能功能不是很完善,但是基本的权限控制效果可以实现,适合新手参考,高手的请飘过~~~~
希望大家能沟互相学习,互相进步,能够提滚更多的示例给大家参考。。。。
好了废话不多说了,直接上东西。。。
(不好意思,本人也是初学,不会讲解,还得靠大家自己参照代码理解)
控制器地址:xuyuan\Home\Lib\Action\admin
这个就是RBAC控制器代码<?php <br />
class RBACAction extends PublicAction{<br>
//用户列表<br>
public function index(){<br>
$res=D('UserRelation')->field('password',true)->relation(true)->select();<br>
$this->assign('list',$res);<br>
$this->display();<br>
}<br>
//用户锁定处理<br>
public function indexlocked(){<br>
$id=$_GET['id'];<br>
//锁定用户<br>
if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)<br>
$this->error('对不起,您不能对此用户做任何操作!');<br>
}else{<br>
$i=M('User')->where(array('id'=>$id))->setField('lock','1');<br>
$this->success('用户已关闭!');<br>
}<br>
}<br>
//用户解锁处理<br>
public function indexlock(){<br>
$id=$_GET['id'];<br>
//解锁用户<br>
if($id==1){//判断用户是否为超级管理员,如果是不能做任何操作(我的超级管理员ID为1)<br>
$this->error('对不起,您不能对此用户做任何操作!');<br>
}else{<br>
$i=M('User')->where(array('id'=>$id))->setField('lock','0');<br>
$this->success('用户已开启!');<br>
}<br>
}<br>
//角色列表<br>
public function relo(){<br>
$relo = M('role')->select();<br>
$this->assign('relo',$relo);<br>
$this->display();<br>
}<br>
//节点列表<br>
public function node(){<br>
$field=array('id','name','title','pid');<br>
$node = M('node')->field($field)->order('sort')->select();<br>
$node=node_merge($node);<br>
//print_r($node);die;<br>
$this->assign('node',$node);<br>
$this->display();<br>
}<br>
//添加用户<br>
public function addUser(){<br>
$role=M('role')->select();<br>
$this->assign('role',$role);<br>
$this->display();<br>
}<br>
//添加用户表单接受<br>
public function addUserHandle(){<br>
//print_r($_POST);<br>
//判断注册用户是否存在<br>
$w=htmlspecialchars(trim($_POST['username']));<br>
$i=M('user')->where(array('username'=>$w))->select();<br>
if($i!=''){<br>
$this->error('用户名已存在!');<br>
}else{<br>
//组合用户信息并添加<br>
$user=array(<br>
'username'=>htmlspecialchars(trim($_POST['username'])),<br>
'password'=>md5($_POST['password']),<br>
'logintime'=>time(),<br>
'loginip'=>get_client_ip(),<br>
'lock'=>$_POST['lock']<br>
);<br>
//添加用户与角色关系<br>
$role=array();<br>
if($uid=M('user')->add($user)){<br>
foreach($_POST['role_id'] as $v){<br>
$role[]=array(<br>
'role_id'=>$v,<br>
'user_id'=>$uid<br>
);<br>
}<br>
M('role_user')->addAll($role);<br>
$this->success('添加成功!',U('index'));<br>
}else{<br>
$this->error('添加失败!');<br>
}<br>
}<br>
}<br>
//添加角色<br>
public function addRole(){<br>
$this->display();<br>
}<br>
//添加角色接受表单<br>
public function addRoleHandle(){<br>
if(M('Role')->add($_POST)){<br>
$this->success('-_- yes!',U('relo'));<br>
}else{<br>
$this->error('-_-。sorry!');<br>
}<br>
}<br>
//添加节点<br>
public function addNode(){<br>
$pid=isset($_GET['pid'])?$_GET['pid']:0;<br>
$level=isset($_GET['level'])?$_GET['level']:1;<br>
$this->assign('pid',$pid);<br>
$this->assign('level',$level);<br>
switch($level){<br>
case 1:<br>
$this->type='应用';<br>
break;<br>
case 2:<br>
$this->type='控制器';<br>
break;<br>
case 3:<br>
$this->type='动作方法';<br>
break;<br>
}<br>
$this->display();<br>
}<br>
//添加节点接受表单<br>
public function addNodeHandle(){<br>
//print_r($_POST);<br>
if(M('Node')->add($_POST)){<br>
$this->success('-_- yes!',U('node'));<br>
}else{<br>
$this->error('-_-。sorry!');<br>
}<br>
<br>
}<br>
//配置权限<br>
public function access(){<br>
$rid=$_GET['rid'];<br>
//读取有用字段<br>
$field=array('id','name','title','pid');<br>
$node=M('node')->order('sort')->field($field)->select();<br>
<br>
//读取用户原有权限<br>
$access=M('access')->where(array('role_id'=>$rid))->getField('node_id',true);<br>
$node=node_merge($node,$access);<br>
<br>
<br>
$this->assign('rid',$rid);<br>
$this->assign('node',$node);<br>
$this->display();<br>
<br>
}<br>
//配置权限接受表单<br>
public function setAccess(){<br>
$rid=$_POST['rid'];<br>
$db=M('access');<br>
//删除原权限<br>
$db->where(array('role_id' => $rid))->delete();<br>
//组合新权限<br>
$data=array();<br>
foreach($_POST['access'] as $v){<br>
$tmp=explode('_',$v);<br>
$data[]=array(<br>
'role_id'=>$rid,<br>
'node_id'=>$tmp[0],<br>
'level'=>$tmp[1]<br>
);<br>
}<br>
//插入新权限<br>
if($db->addAll($data)){<br>
$this->success('修改成功!',U('relo'));<br>
}else{<br>
$this->error('修改失败!');<br>
}<br>
<br>
}<br>
}//end<br>
<br>
?>
这是判断后台每个页面权限的东东。。。(这个PublicAction判断用户是否登录,我每个控制器都是继承他所以每个页面都有判断是否登录的判断,也就不存在可以直接跳过登录直接进来)<?php <br />
class PublicAction extends Action{<br>
//判断用户是否登录<br>
public function _initialize(){<br>
if(!isset($_SESSION[C('USER_AUTH_KEY')])){<br>
$this->redirect('admin/Login/index');<br>
}<br>
$notAuth=in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))||in_array(ACTION_NAME, explode(',', C('NOT_AUTH_ACTION')));<br>
if(C('USER_AUTH_ON')&& !$notAuth){<br>
import('ORG.Util.RBAC');<br>
RBAC::AccessDecision(GROUP_NAME)||$this->error('sorry!您无权访问!');<br>
<br>
}<br>
}<br>
<br>
}//end<br>
<br>
<br>
<br>
<br>
?>
这个是登录模块判断<?php <br />
//后台登录控制<br>
class LoginAction extends Action{<br>
//后台登录模板输出<br>
public function index(){<br>
$this->display();<br>
}<br>
//登录方法<br>
public function login (){<br>
if(!IS_POST) _404('坑爹呀,页面不存在!');<br>
$yzm=$_POST['yzm'];<br>
$username=$_POST['username'];<br>
$pwd=md5($_POST['password']);<br>
if($_SESSION['verify']!=md5($yzm)){<br>
$this->error('验证码错误!');<br>
}<br>
$i=M('User')->where(array('username'=>$username))->find();<br>
if(!$i|$i['password']!=$pwd){<br>
$this->error('用户名或者密码错误!');<br>
}<br>
if($i['lock']==1){<br>
$this->error('-_-。sorry!您的ID不合法!');<br>
}<br>
$data=array(<br>
'logintime'=>time(),<br>
'loginip'=>get_client_ip(),<br>
'id'=>$i['id'],<br>
);<br>
M('User')->save($data);<br>
session(C('USER_AUTH_KEY'),$i['id']);<br>
session('username',$i['username']);<br>
session('logintime',date('Y-M-D H:i:s',$i['logintime']));<br>
session('loginip',$i['loginip']);<br>
<br>
<br>
<br>
//验证超级管理员<br>
if($i['username']==C('RBAC_SUPERADMIN')){<br>
session(C('ADMIN_AUTH_KEY'),true);<br>
}<br>
//引入RBAC并读取验证权限<br>
import('ORG.Util.RBAC');<br>
RBAC::saveAccessList();<br>
<br>
$this->redirect('admin/Index/index');<br>
}<br>
//引入验证码<br>
public function yzm(){<br>
import('ORG.Util.Image');<br>
Image::buildImageVerify(4,1,'png',80,32);<br>
}<br>
<br>
}//end<br>
<br>
<br>
<br>
?>
这一块是后台配置文件<?php <br />
return array(<br>
'TMPL_PARSE_STRING'=>array(<br>
'__PUBLIC__'=>__ROOT__.'/'.APP_NAME.'./Tpl/Admin/Public',<br>
),<br>
'URL_HTML_SUFFIX' => '.html',<br>
/**********************************RBAC配置*******************************************/<br>
'RBAC_SUPERADMIN' => 'admin', //超级管理员名<br>
'ADMIN_AUTH_KEY' => 'superadmin', //超级管理员识别<br>
'USER_AUTH_ON' => true, //是否开启验证<br>
'USER_AUTH_TYPE' => 1, //验证类型(1.登录验证2.实时验证)<br>
'USER_AUTH_KEY' => 'uid', //用户认证识别号<br>
'NOT_AUTH_MODULE' => 'Index', //无需认证的控制器<br>
'NOT_AUTH_ACTION' => 'addUserHandle,addRoleHandle,addNodeHandle,setAccess', //无需验证的模块(动作方法)<br>
'RBAC_ROLE_TABLE' => 'hd_role', //角色表名称<br>
'RBAC_USER_TABLE' => 'hd_role_user', //角色与用户关联表名称<br>
'RBAC_NODE_TABLE' => 'hd_node', //节点表名称<br>
'RBAC_ACCESS_TABLE' => 'hd_access' //权限表名称<br>
);<br>
<br>
<br>
?>
最后希望大家多多进步,多多分享。。。。(有分享才有进步嘛~~~)
(可不可以加个精啊!!! :)~~~~~)
xuyuan.zip ( 1.77 MB 下载:458 次 )
AD:真正免费,域名+虚机+企业邮箱=0元