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文件夹