咨询电话:186 7916 6165 咨询电话:186 7916 6165 (微信同号)    在线QQ:181796286
NEWS BLOG ·
学无止境
关注开优网络 关注前沿
PHP Web开发之ThinkPHP框架
PHP Web开发之无限级分类

PHP Web开发之权限模块

发表日期:2015-10-25    文章编辑:南昌开优网络    浏览次数:4529    标签:PHP应用

1、找到Thinkphp原文件中的Examples\Rbac\Conf中的配置RBAC
     'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE'    =>1,// 默认认证类型 1 登录认证 2 实时认证
        'USER_AUTH_KEY'             =>'authId',// 用户认证SESSION标记
        'ADMIN_AUTH_KEY'     =>'administrator',
        'USER_AUTH_MODEL'           =>'User',// 默认验证数据表模型.用户表
        'AUTH_PWD_ENCODER'          =>'md5',// 用户认证密码加密方式
        'USER_AUTH_GATEWAY'         =>'/Public/login',// 默认认证网关
        'NOT_AUTH_MODULE'           =>'Public',// 默认无需认证模块
        'REQUIRE_AUTH_MODULE'       =>'',// 默认需要认证模块
        'NOT_AUTH_ACTION'           =>'',// 默认无需认证操作
        'REQUIRE_AUTH_ACTION'       =>'',// 默认需要认证操作
        'GUEST_AUTH_ON'             =>false,    // 是否开启游客授权访问
        'GUEST_AUTH_ID'             =>0,        // 游客的用户ID
        'RBAC_ROLE_TABLE'           =>'think_role',
        'RBAC_USER_TABLE'           =>'think_role_user',
        'RBAC_ACCESS_TABLE'         =>'think_access',
        'RBAC_NODE_TABLE'           =>'think_node',

2、创建表
CREATE TABLE IF NOT EXISTS `think_access` (//角色权限表
  `role_id` smallint(6) unsigned NOT NULL,//角色id
  `node_id` smallint(6) unsigned NOT NULL,//节点id,必须是先可以访问项目->模块->方法
  `level` tinyint(1) NOT NULL,//节点表中的level字段相同
  `module` varchar(50) DEFAULT NULL,//模块名称.可以不写
  `pid` int,//节点表中的pid字段相同
  KEY `groupId` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `think_node` (//节点表
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,//id
  `name` varchar(20) NOT NULL,//项目名称、模块名称、方法名称,一定要对应项目中的名称
  `title` varchar(50) DEFAULT NULL,//节点描述.可以不写
  `status` tinyint(1) DEFAULT '0',//节点状态:'1'为开启
  `remark` varchar(255) DEFAULT NULL,//详细描述.可以不写
  `sort` smallint(6) unsigned DEFAULT NULL,//节点排序.可以不写
  `pid` smallint(6) unsigned NOT NULL,//父节点:即该名称的父级id
  `level` tinyint(1) unsigned NOT NULL,//节点分级:'1'为项目,'2'为模块,'3'为方法
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `status` (`status`),
  KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `think_role` (//角色表
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,//id
  `name` varchar(20) NOT NULL,//角色名称
  `pid` smallint(6) DEFAULT NULL,//父级id
  `status` tinyint(1) unsigned DEFAULT NULL,//状态:'1'为开启
  `remark` varchar(255) DEFAULT NULL,//说明
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `status` (`status`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

CREATE TABLE IF NOT EXISTS `think_role_user` (//用户角色表
  `role_id` mediumint(9) unsigned DEFAULT NULL,//角色id
  `user_id` char(32) DEFAULT NULL,//用户id
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

create table think_user(//用户表...自定义
id int not null primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null
.......
)
3、在Lib\Action中创建CommonAction.class.php 并初使化接口
class CommonAction extends Action{
function _initialize() {
        // 用户权限检查
        if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {//读取配置文件判断是否开启权限验证
            import('ORG.Util.RBAC');//导入RBAC.class.php文件
            if (!RBAC::AccessDecision()) {
                //检查认证识别号
                if (!$_SESSION [C('USER_AUTH_KEY')]) {
                    //跳转到认证网关
                    redirect(PHP_FILE . C('USER_AUTH_GATEWAY'));
                }
                // 没有权限 抛出错误
                if (C('RBAC_ERROR_PAGE')) {
                    // 定义权限错误页面
                    redirect(C('RBAC_ERROR_PAGE'));
                } else {
                    if (C('GUEST_AUTH_ON')) {
                        $this->assign('jumpUrl', PHP_FILE . C('USER_AUTH_GATEWAY'));
                    }
                    // 提示错误信息
                    $this->error(L('_VALID_ACCESS_'));
                }
            }
        }
    }
}
4、创建PublicAction.class.php 
class PublicAction extends Action{
function index(){
$this->login();
}
function login(){
$this->display('./Public/login.html');
}
function checkLogin(){
if(empty($_POST['username'])) {
$this->error('帐号错误!');
}elseif (empty($_POST['password'])){
$this->error('密码必须!');
}
//elseif (empty($_POST['verify'])){
//$this->error('验证码必须!');
//}
        //生成认证条件
        $map            =   array();
// 支持使用绑定帐号登录
$map['username ']= $_POST['username'];
     
//if($_SESSION['verify'] != md5($_POST['verify'])) {
//$this->error('验证码错误!');
//}
import ( 'ORG.Util.RBAC' );
        $authInfo = RBAC::authenticate($map);
        //使用用户名、密码和状态的方式进行认证
        if(false === $authInfo) {
            $this->error('帐号不存在或已禁用!');
        }else {
            if($authInfo['password'] != md5($_POST['password'])) {
            $this->error('密码错误!');
            }
            $_SESSION[C('USER_AUTH_KEY')]=$authInfo['id'];           
            if($authInfo['username']=='admin') {
            $_SESSION['administrator']=true;
            }
// 缓存访问权限
            RBAC::saveAccessList();
$this->success('登录成功!');

}
}
function loginout(){
if(isset($_SESSION[C('USER_AUTH_KEY')])) {
unset($_SESSION[C('USER_AUTH_KEY')]);
unset($_SESSION);
session_destroy();
            $this->assign("jumpUrl",__URL__.'/login/');
           $this->success('登出成功!');
        }else {
           $this->error('已经登出!');
        }
}
}
5、创建前台登录页login.html
<form action="__URL__/checkLogin" method="POST">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
6、到ThinkPHP原代码中找到success.html文件提示信息页复制到项目admin\Tpl\default\Public文件夹中.注要先创建Public文件夹