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